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。
您可以创建您的构建器。
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)
如果您需要从 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 依赖解析机制集成,您需要:
使用以下代码设置 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)
归档时间: |
|
查看次数: |
7850 次 |
最近记录: |