我有一个使用OWIN和Autofac的WebApi应用程序。虽然控制器和参数得到了正确解析,但我希望能够使用OwinContext.Get<type>
来解析使用Autofac注册的类型。那可能吗?
已设置app.UseAutofacMiddleware(container);
和config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
例如,我注册了builder.Register<IAppConfiguration>(c => new AppConfig());
,我想使用owinContext.Get<IAppConfiguration>()
解决此问题。
答案 0 :(得分:7)
无法让OwinContext.Get<T>
从Autofac中解析出来。如果你深入了解Reflector中的Microsoft.Owin.OwinContext.Get,你会看到它&#39 ; s完全由您在环境中注册的事物字典支持。这不是动态的,没有办法(没有创建自己的IOwinContext
实现)来解决 从字典或< / em>脱离依赖性解决方案。
如果您使用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。目前还没有一种方法可以从HttpConfiguration
获取对当前IOwinContext
或全局容器的引用。同样,如果你走这条路线,你就不会有每个请求的依赖关系,所以要注意。
答案 1 :(得分:4)
IOwinContext.Get
使用Environment
字典,解析直接向Owin注册的对象,但不考虑Autofac容器。
我设法通过访问Environment属性中的Autofac OwinLifetimeScope并使用范围来解析服务。
您可以使用此代码访问LifetimeScope
var scope=OwinContext.Get<Autofac.Core.Lifetime.LifetimeScope>("autofac:OwinLifetimeScope");
然后
scope.GetService(type)
你应该检查空值并以更好的方式写它,因为可能是扩展方法。
答案 2 :(得分:4)
如果项目中有WebAPI,则可以模拟这样的http请求
var dependencyScope = new AutofacWebApiDependencyScope(owinContext.GetAutofacLifetimeScope());
var myService = dependencyScope.GetService(typeof(MyService));