我有一个使用OWIN和Autofac的WebApi应用程序.虽然控制器和参数得到了正确解析,但我希望能够使用OwinContext.Get type解决使用Autofac注册的类型.那可能吗? 已经是setapp.UseAutofacMiddleware(容器);和
已经是setapp.UseAutofacMiddleware(容器);和config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
例如,我注册了builder.Register< IAppConfiguration>(c => new AppConfig());我想使用owinContext.Get< IAppConfiguration>()来解决它.
没有办法获得OwinContext.Get< T>从Autofac解决问题.如果您深入了解Reflector中的Microsoft.Owin.OwinContext.Get,您将看到它完全由您在环境中注册的事物字典支持.它不是动态的,没有办法(没有创建自己的IOwinContext实现)来让它解决字典之外或依赖解析的问题.如果您在DelegatingHandler或ApiController中,则将引用当前的HttpRequestMessage.使用message.GetDependencyScope()获取当前请求级依赖项范围以解析服务.
public HttpResponseMessage SomeControllerAction() { var service = this.Request.GetDependencyScope().GetService(typeof(Service)); }
如果您有权访问HttpConfiguration,那么您可以使用HttpConfiguration.DependencyResolver来解决问题.请注意,解析程序不具有可用的每请求依赖项. Web API跟踪入站HttpRequestMessage的请求依赖范围,因此请注意该限制. There is an FAQ about per-request lifetime scope可以帮助您完成这项工作.
如果你所在的地方只有一个IOwinContext,你可能需要使用像CommonServiceLocator和associated Autofac.Extras.CommonServiceLocator这样的软件包.真的没有办法从IOwinContext获取对当前HttpConfiguration或全局容器的引用.同样,如果你走这条路线,你就不会有每个请求的依赖关系,所以要注意.