3

我正在研究 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 中工作吗?还是我只需要命名所有映射并要求命名映射,即使是默认情况?

4

1 回答 1

0

这有效

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

于 2014-12-22T07:44:23.517 回答