在Ninject中,我可以使用类nav
Ninject定义:
WebContainerManager
Ninject用法:
var logManager = new LogManagerAdapter();
container.Bind<ILogManager>().ToConstant(logManager);
我的问题是如何在Autofac中做同样的事情,以获得所需的接口类?
更新1:我使用的是WebAPi 2,而不是MVC。
答案 0 :(得分:3)
您可以创建构建器。
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();
}
答案 1 :(得分:2)
如果需要从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>();
但正如其他评论中已经提到的那样,Service Locator是一种应该避免使用的反模式。
为了将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));