我正在研究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中使用它吗?或者我是否只需为所有映射命名,并且即使是默认情况也要求命名映射?
答案 0 :(得分: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();
}
}
&#13;