OWIN服务分辨率使用Autofac

bbe*_*eda 4 dependency-injection autofac asp.net-web-api 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>().

Tra*_*lig 7

没有办法OwinContext.Get<T>从Autofac解决问题.如果您深入了解Reflector中的Microsoft.Owin.OwinContext.Get,您将看到它完全由您在环境中注册的事物字典支持.这不是动态的,也没有办法(没有创建自己IOwinContext的实现),以获得它来解决的事情无论是从字典从依赖解析.

如果您在a DelegatingHandler或a中,ApiController您将获得当前的参考HttpRequestMessage.使用message.GetDependencyScope()来获得当前请求级依赖范围,以解决服务.

public HttpResponseMessage SomeControllerAction()
{
  var service = this.Request.GetDependencyScope().GetService(typeof(Service));
}
Run Code Online (Sandbox Code Playgroud)

如果您有权访问,HttpConfiguration那么您可以使用它HttpConfiguration.DependencyResolver来解决问题.请注意,解析程序不具有可用的每请求依赖项.Web API跟踪入站的请求依赖范围,HttpRequestMessage因此请注意该限制.有关每个请求生命周期范围的常见问题解答可以帮助您完成此操作.

如果你在一个地方,有是只有一个IOwinContext,你可能需要使用一个包状的CommonServiceLocator相关Autofac.Extras.CommonServiceLocator.实际上没有办法从a获取对当前HttpConfiguration或全局容器的引用IOwinContext.同样,如果你走这条路线,你就不会有每个请求的依赖关系,所以要注意.

  • 这只是过时的@travis吗?`owinContext.GetAutofacLifetimeScope()`有效. (3认同)
  • 是的,这是自此答案以来的新扩展。 (2认同)

bbe*_*eda 4

使用IOwinContext.Get字典Environment,解析直接向 Owin 注册的对象,它不考虑 Autofac 容器。

我设法通过访问环境属性中的 Autofac OwinLifetimeScope 并使用该范围来解析服务来做到这一点。

您可以使用此代码访问 LifetimeScope

var scope=OwinContext.Get<Autofac.Core.Lifetime.LifetimeScope>("autofac:OwinLifetimeScope"); 
Run Code Online (Sandbox Code Playgroud)

进而

scope.GetService(type)
Run Code Online (Sandbox Code Playgroud)

您应该检查空值并以更好的方式编写它,例如扩展方法。