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 ] 超出依赖解析。
如果您在 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 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));
我有一个使用 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 ] 超出依赖解析。
如果您在 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 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));