[英]How to get container for Autofac for WebAPI2?
在Ninject中,我可以通过使用类WebContainerManager
获得接口所需的对象
Ninject定义:
var logManager = new LogManagerAdapter();
container.Bind<ILogManager>().ToConstant(logManager);
Ninject用法:
var log = WebContainerManager.Get<ILogManager>().GetLog(typeof(WebApiApplication));
我的问题是如何在Autofac中执行相同操作,以获取所需的接口类?
更新1:我正在使用WebAPi 2,而不是MVC。
您可以创建您的构建器。
var builder = new ContainerBuilder();
// Usually you're only interested in exposing the type
// via its interface:
builder.RegisterType<SomeType>().As<IService>();
// However, if you want BOTH services (not as common)
// you can say so:
builder.RegisterType<SomeType>().AsSelf().As<IService>();
然后,您将能够构建自己的IoC:
IContainer Container = builder.Build();
还有一个如何从容器中获取资源的简单示例:
// Create the scope, resolve your IService,
// use it, then dispose of the scope.
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.Resolve<IService>();
writer.DoSomething();
}
如果需要从由Autofac本身解析的类访问Autofac容器,则可以指定对由Autofac自动提供的IComponentContext的依赖。
例:
public void SomeComponent(IComponentContext context)
{
this.context = context;
}
...
// somewhere inside SomeComponent
context.Resolve<ILogManager>();
如果您的代码在ASP.Net环境中运行,则很可能会设置其DependencyResolver,因此您始终可以像以下方式访问它:
DependencyResolver.Current.GetService<ILogManager>();
但是正如其他评论中已经提到的那样,服务定位器是一种应避免的反模式。
为了将autofac容器与标准MVC依赖项解析机制集成在一起,您需要:
使用以下代码设置DependencyResolver
var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
并且如果您不介意在应用程序代码中显式依赖Autofac,则可以使用使用Ninject WebContainerManager的相同方式访问全局Autofac解析器引用:
var log = AutofacDependencyResolver.Current.Resolve<ILogManager>().GetLog(typeof(WebApiApplication));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.