NInject“mis” - 解决几个映射中的“默认”实例

时间:2013-08-16 20:36:42

标签: inversion-of-control ninject unity-container

我正在研究IoC容器,并在使用NInject时遇到了一个问题。

当我有一个接口,并且我定义了该接口的几个映射 - 一个未命名,我的默认映射,以及另外两个命名实例 - 使用Microsoft Unity时,我很好地获取注册的默认类型,当要求Unity解析接口时没有指定名称。

统一:

myContainer.RegisterType<ILogger, DefaultLogger>();
myContainer.RegisterType<ILogger, FastLogger>("fast");
myContainer.RegisterType<ILogger, DatabaseLogger>("dblogger");

var result = myContainer.Resolve<ILogger>();

此处,result的类型为DefaultLogger - 正如我预期的那样(Autofac也是这样的。)

其他容器表现不同 - 有些是非常奇怪的。而NInject只会导致异常:

k.Bind<ILogger>().To<DefaultLogger>();
k.Bind<ILogger>().To<FastLogger>().Named("fast");
k.Bind<ILogger>().To<DatabaseLogger>().Named("dblogger");

var result = k.Get<ILogger>();

我没有像我预期的那样获得DefaultLogger的实例,而是获得例外:

  

Ninject.ActivationException未处理   消息=激活ILogger时出错   可以使用多个匹配的绑定。

是的 - 我知道我有多个映射 - 但我希望在没有要求命名映射时我会得到非命名映射.......

我可以在NInject中使用它吗?或者我是否只需为所有映射命名,并且即使是默认情况也要求命名映射?

1 个答案:

答案 0 :(得分:0)

这有效

&#13;
&#13;
class Program
{
  static void Main(string[] args)
  {
    var kernel = new StandardKernel();

    kernel.Bind<IOperation>().To<DefaultOperation>()
    .When(c => !c.Parameters.Any());

    kernel.Bind<IOperation>().To<SuccessOperation>()
    .Named("Success");

    kernel.Bind<IOperation>().To<FailureOperation>()
    .Named("Failure");

    var operation = kernel.Get<IOperation>();
    operation.ShowMessage();
    Console.ReadLine();
  }
}
&#13;
&#13;
&#13;