OWIN服务分辨率使用Autofac

时间:2015-02-25 17:32:32

标签: dependency-injection asp.net-web-api autofac owin

我有一个使用OWIN和Autofac的WebApi应用程序。虽然控制器和参数得到了正确解析,但我希望能够使用OwinContext.Get<type>来解析使用Autofac注册的类型。那可能吗?

已设置app.UseAutofacMiddleware(container);config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

例如,我注册了builder.Register<IAppConfiguration>(c => new AppConfig());,我想使用owinContext.Get<IAppConfiguration>()解决此问题。

3 个答案:

答案 0 :(得分:7)

无法让OwinContext.Get<T>从Autofac中解析出来。如果你深入了解Reflector中的Microsoft.Owin.OwinContext.Get,你会看到它&#39 ; s完全由您在环境中注册的事物字典支持。这不是动态的,没有办法(没有创建自己的IOwinContext实现)来解决 从字典或< / em>脱离依赖性解决方案。

如果您使用DelegatingHandlerApiController ,则会引用当前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 的地方,您可能需要使用像CommonServiceLocatorassociated 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));