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>()
.
没有办法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
.同样,如果你走这条路线,你就不会有每个请求的依赖关系,所以要注意.
使用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)
您应该检查空值并以更好的方式编写它,例如扩展方法。
归档时间: |
|
查看次数: |
4292 次 |
最近记录: |