我已经制作了一个简单的OWIN中间件,它将为我提供一个User对象并将其添加到HttpContext.Current.Items
,以便每个请求的所有控制器和视图都可用。
这是我的代码:
public class SetCurrentUserMiddleware : OwinMiddleware
{
public SetCurrentUserMiddleware(OwinMiddleware next) : base(next)
{
}
public override Task Invoke(IOwinContext context)
{
if (context.Request.User.Identity.IsAuthenticated)
{
// Do some work to get a userId... (omitted)
var repo = new UserRepository();
User user = repo.Get(userId);
HttpContext.Current.Items["CurrentUserContext"] = user;
}
return Next.Invoke(context);
}
}
我在我的网络应用程序中使用Ninject - 我如何重构这个中间件,以便我的UserRepository作为依赖注入?这有可能吗?
答案 0 :(得分:0)
根据this page,您可以提供自己的构造函数参数。
public class SetCurrentUserMiddleware : OwinMiddleware
{
private readonly IUserRepository userRepository;
public SetCurrentUserMiddleware(OwinMiddleware next, IUserRepository userRepository) : base(next)
{
if (userRepository == null)
throw new ArgumentNullException("userRepository");
this.userRepository = userRepository;
}
public override Task Invoke(IOwinContext context)
{
if (context.Request.User.Identity.IsAuthenticated)
{
// Do some work to get a userId... (omitted)
User user = this.userRepository.Get(userId);
HttpContext.Current.Items["CurrentUserContext"] = user;
}
return Next.Invoke(context);
}
}
答案 1 :(得分:0)
聚会晚了一点,但是如果有人跌倒了,只是想提供帮助。
我假设您正在Startup.cs
中注册自定义中间件。与app.Use<SetCurrentUserMiddleware>();
类似。
请注意,app.Use<T>()
接受额外的参数作为args[]
,这意味着您可以
//example using AutoFac
app.Use<SetCurrentUserMiddleware>(container.Resolve<IUserRepository>());
额外的参数将在构建中间件时作为任何其他构造函数参数提供给中间件。