繁体   English   中英

如何获取Autofac for WebAPI2的容器?

[英]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依赖项解析机制集成在一起,您需要:

  • 安装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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM