OWIN服务解析使用Autofac

OWIN Service resolution Using Autofac

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

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

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

没有办法让 OwinContext.Get<T> 解决 Autofac 的问题。 如果你深入研究 Reflector 中的 Microsoft.Owin.OwinContext.Get,你会看到它得到了支持完全通过您在环境中注册的事物的字典。它不是动态的,没有办法(不创建你自己的 IOwinContext 实现)让它从字典 中解决问题 either ] 超出依赖解析。

如果您在 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,你可能需要使用像 CommonServiceLocator and the associated Autofac.Extras.CommonServiceLocator 这样的包。确实没有办法仅从 IOwinContext 获取对当前 HttpConfiguration 或全局容器的引用。同样,如果你走这条路,你将没有可用的每个请求依赖项,所以要注意。

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

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

您可以使用此代码访问 LifetimeScope

var scope=OwinContext.Get<Autofac.Core.Lifetime.LifetimeScope>("autofac:OwinLifetimeScope"); 

然后

scope.GetService(type)

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

如果你的项目中有WebAPI,你可以像这样模拟一个http请求

var dependencyScope = new AutofacWebApiDependencyScope(owinContext.GetAutofacLifetimeScope());
var myService = dependencyScope.GetService(typeof(MyService));