ASP.NET 5 个中间件的 DI 注册



我有一个中间件类,可以让当前用户从数据库登录到当前请求的应用程序:

public class CurrentUserMiddleware
{
    RequestDelegate m_next;
    UserManager<User> m_userManager;
    public CurrentUserMiddleware(RequestDelegate next, UserManager<User> userManager )
    {
        m_next = next;
        m_userManager = userManager;
    }
    public async Task Invoke(HttpContext context)
    {
        var userId = context.User.Identity.GetUserId();
        var user = await m_userManager.FindByIdAsync(userId);
        var currentUserContext = new CurrentUserContext { User = user };
        // Register CurrentUserContext with DI to this currentUserContext instance
        await m_next(context);
    }
}

解决此问题后,我想注册一个可以通过 DI 在应用程序的其他区域中解析的CurrentUserContext

例如:

public class HomeController : Controller
{
    private readonly CurrentUserContext m_currentUserContext;
    public HomeController(CurrentUserContext currentUserContext)
    {
        m_currentUserContext = currentUserContext;
    }
    public async Task<IActionResult> Index()
    {
        var userName = m_currentUserContext.User.Username;
        return View();
    }
}

如何正确注册此CurrentUserContext?所有其他 DI 注册都是在 Startup ConfigureServices 中完成的,但这不适用于这种情况,因为我需要解决每个请求的CurrentUserContext

不确定您使用的是什么 DI 容器,所以有点通用...

对于大多数 DI 容器,默认实例化是每次调用,因此无论它在实例化对象时注册到何处,您都可以访问当前上下文。大多数容器还提供了指定"工厂"方法的选项,而不仅仅是类型 name - 因此您可以从此类工厂调用"Invoke"方法。

请注意,大多数容器不支持async解析,因此您可以注册对象,这些对象将允许您异步访问"用户上下文":

 ICreateUserContext { Task<CurrentUserContext> GetContextAsync();}

最新更新