如何为 WebAPI2 获取 Autofac 的容器?

P.K*_*.K. 5 c# ninject inversion-of-control autofac

在 Ninject 中,我可以通过使用类来获取接口所需的对象 WebContainerManager

Ninject 定义:

 var logManager = new LogManagerAdapter(); 
 container.Bind<ILogManager>().ToConstant(logManager); 
Run Code Online (Sandbox Code Playgroud)

Ninject 用法:

var log = WebContainerManager.Get<ILogManager>().GetLog(typeof(WebApiApplication));
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*sok 6

您可以创建您的构建器。

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>();
Run Code Online (Sandbox Code Playgroud)

然后您将能够构建您的 IoC:

IContainer Container = builder.Build();
Run Code Online (Sandbox Code Playgroud)

以及如何从容器中获取资源的简单示例:

// 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 美丽的例子和“如何开始”:http://docs.autofac.org/en/latest/getting-started/ (2认同)
  • 在您的代码中,我将“using (varscope = Container.BeginLifetimeScope())”更改为“using(varscope = GlobalConfiguration.Configuration.DependencyResolver.GetRequestLifetimeScope())”以在代码中获取容器,并且它有效。希望没问题:) (2认同)

Vit*_*yer 6

如果您需要从 Autofac 本身解析的类访问 Autofac 容器,那么您可以指定对 Autofac 自动提供的 IComponentContext 的依赖关系。

例子:

public void SomeComponent(IComponentContext context)
{
   this.context = context;
}
...
// somewhere inside SomeComponent
context.Resolve<ILogManager>();
Run Code Online (Sandbox Code Playgroud)

如果您的代码在 ASP.Net 环境中运行,那么您很可能设置了其 DependencyResolver,因此您始终可以像这样访问它:

DependencyResolver.Current.GetService<ILogManager>();
Run Code Online (Sandbox Code Playgroud)

但正如其他评论中已经提到的,Service Locator 是一种应该避免的反模式。

为了将 autofac 容器与标准 MVC 依赖解析机制集成,您需要:

  • 安装 Autofac.Mvc5 nuget 包
  • 使用以下代码设置 DependencyResolver

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

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

var log = AutofacDependencyResolver.Current.Resolve<ILogManager>().GetLog(typeof(WebApiApplication));
Run Code Online (Sandbox Code Playgroud)