【发布时间】:2018-04-05 06:59:32
【问题描述】:
环境:ASP.NET WebAPI 2、NInject Web API (3.3.0.0)
用例:我正在使用 OwinStartup 类设置自定义 Owin 身份验证。该类使用 ASP.NET Identity.IUserStore 来设置用户。我的挑战是让配置的解析器查询此参考。但是,MVC 中的解析器检索在 WebAPI 中不起作用
var userStore = DependencyResolver.Current.GetService(typeof(IUserStore<ExtendedUser, string>)) as IUserStore<ExtendedUser, string>;
我的启动配置如下:-
public partial class Startup
{
System.Web.Http.Dependencies.IDependencyResolver resolver;
public void Configuration(IAppBuilder app)
{
HttpConfiguration httpConfig = new HttpConfiguration();
// Due to "new" config, the underlying resolver gets empty
this.resolver = httpConfig.DependencyResolver;
this.ConfigureOAuthTokenGeneration(app);
// ... other code removed
}
private void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
// Fails due to resolver being empty
var userStore = this.resolver.GetService(typeof(IUserStore<ExtendedUser, string>)) as IUserStore<ExtendedUser, string>;
UserService.UserStore = userStore;
app.CreatePerOwinContext<UserService>(UserService.Create);
// Other code removed
}
}
用户服务类:-
public class UserService : UserManager<ExtendedUser, string>
{
public UserService(IUserStore<ExtendedUser, string> store)
: base(store)
{
}
//[Ninject.Inject]
public static IUserStore<ExtendedUser, string> UserStore { get; set; }
public static UserService Create(IdentityFactoryOptions<UserService> options, IOwinContext context)
{
// var userStore = DependencyResolver.Current.GetService(typeof(IUserStore<ExtendedUser, string>)) as IUserStore<ExtendedUser, string>;
var manager = new UserService(UserStore);
....
}
}
接口在 NInject 配置中配置正确。 NInject 否则设置正确,因为没有 Owin 集成,我可以解决我的服务。
kernel.Bind<Microsoft.AspNet.Identity.IUserStore<ExtendedUser, string>>().To<UserStore<ExtendedUser, string>>();
已经尝试过
- 使用“Inject”参数进行属性注入
- 将请求的 UserManager 与服务分开(这也需要一个需要显式初始化的构造函数
更新 1:类似情况的另一个用例:我正在尝试在 ExceptionFilter 上设置自定义记录器,如下所示:-
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Exception handling
config.Filters.Add(new ExceptionFilters());
}
}
public class ExceptionFilters : ExceptionFilterAttribute
{
public ExceptionFilters(ZLogging.ILogger logger)
{
this.logger = logger;
}
public override void OnException(HttpActionExecutedContext context)
{
this.logger.Log(....)
}
}
这里再次调用 ExceptionFilters 构造函数在 WebApiConfig 的 Register 方法中被阻止。
在 WebApiConfig 中,我们可以使用传递的 HttpConfiguration 实例获取 DependencyResolver,然后获取 logger 服务。因此在这里它不是问题。但是,在无法访问 HttpConfiguration 的任何地方,都面临着让解析器退出的问题
更新 2 在 Startup 类中使用 DI 设置如下:-
public void Configuration(IAppBuilder app)
{
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.DependencyResolver = new NinjectDependencyResolver(new Ninject.StandardKernel() );
this.resolver = httpConfig.DependencyResolver;
.... }
虽然这清除了 Owin 引用解析的问题,但它破坏了 WebAPI 中的异常过滤器(参见更新 1),因为 Global.asax 在执行周期中的启动之前首先被解析:(
在获取解析器以提供服务方面需要帮助。可以提供任何必要的见解。
【问题讨论】:
标签: asp.net-web-api2 owin ninject