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