Autofac将特定实现注入家庭控制器

时间:2013-11-01 10:55:56

标签: autofac

这是我第一次使用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

2 个答案:

答案 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找到更多信息。