0

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

我的所有三种实现的 Home 控制器构造函数都很简单:

private ILogger[] loggers;
public HomeController(ILogger[] loggers)
{
  this.loggers = loggers;
}

如何将特定的“MemoryLogger”注册到我的 MemoryController?

 private ILogger _memoryLogger;
        public MemoryController(ILogger logger)
        {
            this._memoryLogger = logger;
        }

我知道我可以用特定的实现重新注册控制器。

与 Ninject 相同

使用 Ninject 注入实现相同接口的不同类

4

2 回答 2

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)));

我只是希望它会为其他人节省时间:) 如果您有更好的解决方案,请分享。

于 2013-11-01T15:26:27.980 回答
0

您可以使用元数据功能。您可以在wiki 页面上找到更多信息。

于 2013-11-01T13:33:51.520 回答