【问题标题】:OWIN Service resolution Using Autofac使用 Autofac 的 OWIN 服务解析
【发布时间】:2015-02-25 17:32:32
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    没有办法让OwinContext.Get<T> 解决来自 Autofac 的问题。 如果您深入了解 Reflector 中的 Microsoft.Owin.OwinContext.Get,您会发现它完全由你在环境中注册的东西。它不是动态的,并且没有办法(不创建您自己的 IOwinContext 实现)让它解决 字典之外的问题 依赖解析之外的问题。 p>

    如果您在 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这样的包.真的没有办法仅从IOwinContext 获取对当前HttpConfiguration 或全局容器的引用。同样,如果您走这条路线,您将无法获得每个请求的依赖项,因此请注意。

    【讨论】:

    • 是的,昨天我获取了 Katana 实现的源代码,并注意到 OwinContext 的实现,它从 Environment 属性中读取键。查看 Environment 内容后,我注意到 autofac:OwinLifetimeScope 可以访问当前的 Autofac 范围。我可以用它来解决我的服务。扩展方法完成了这项工作。谢谢
    • 这只是过时的@travis 吗? owinContext.GetAutofacLifetimeScope() 工作。
    • 是的,这是自此答案以来的新扩展。
    【解决方案2】:

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

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

    您可以使用此代码访问 LifetimeScope

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

    然后

    scope.GetService(type)
    

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

    【讨论】:

    • 如果 autofac:OwinLifetimeScope 键后面有一个大的 guid,则不起作用。请改用owinContext.GetAutofacLifetimeScope()
    • 我的钥匙后面还有一个 guid - 你知道为什么吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多