这是我第一次使用autofac& mvc 4。 我已经使用Nuget包安装了AutoFac。 我安装了我的nuget包:
<package id="Autofac" version="3.1.5" targetFramework="net45" />
<package id="Autofac.Mvc4" version="3.1.0" targetFramework="net45" />
我有三个记录器实现:
builder.RegisterType<DbLogger>().As<ILogger>();
builder.RegisterType<TextLogger>().As<ILogger>();
builder.RegisterType<MemoryLogger>().As<ILogger>();
我的家庭控制器使用以下代码注册:
// in case we want to exclude this in external dll
builder.RegisterControllers(Assembly.GetCallingAssembly());
所有三种实现的My Home控制器构造函数都很简单:
private ILogger[] loggers;
public HomeController(ILogger[] loggers)
{
this.loggers = loggers;
}
如何在MemoryController中注册特定的“MemoryLogger”?
private ILogger _memoryLogger;
public MemoryController(ILogger logger)
{
this._memoryLogger = logger;
}
我知道我可以通过具体实施重新注册控制器。
与Ninject相同
Inject different classes that implement the same interface using Ninject
答案 0 :(得分:1)
解决方案非常简单:
const string loggerImplementation = "DbLoggerForMemoryController";
builder.RegisterType<DbLogger>().As<ILogger>().Named<ILogger>(loggerImplementation);
builder.RegisterType<TextLogger>().As<ILogger>();
builder.RegisterType<MemoryLogger>().As<ILogger>();
builder.Register(x => new MemoryController(x.ResolveNamed<ILogger>(loggerImplementation)));
我希望它能为其他人节省时间:) 如果您有更好的解决方案,请分享。
答案 1 :(得分:0)
您可以使用元数据功能。您可以在wiki page找到更多信息。