如何为WebAPI2获取Autofac容器?

时间:2015-07-14 11:00:29

标签: c# ninject inversion-of-control autofac

在Ninject中,我可以使用类nav

获取接口所需的对象

Ninject定义:

WebContainerManager

Ninject用法:

 var logManager = new LogManagerAdapter(); 
 container.Bind<ILogManager>().ToConstant(logManager); 

我的问题是如何在Autofac中做同样的事情,以获得所需的接口类?

更新1:我使用的是WebAPi 2,而不是MVC。

2 个答案:

答案 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依赖性解析机制集成,您需要:

  • 安装Autofac.Mvc5 nuget package
  • 使用以下代码

    设置DependencyResolver

    var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

如果您不介意在应用程序代码中明确依赖Autofac,您可以像使用Ninject WebContainerManager一样访问全局Autofac解析器引用:

var log = AutofacDependencyResolver.Current.Resolve<ILogManager>().GetLog(typeof(WebApiApplication));