我的问题是真的在这里发布了一个老问题的重复: Ninject 2.2多个绑定
看来有人要对付这个早在2011年有谁知道是否有某种方式来关闭这些警告在Ninject? 或一些其他的解决办法?
编辑
为了应对@BatteryBackupUnit,这里是我的确切问题:
我有多个库......在我的核心库,我做这样的事情:
- 查找主机应用程序中引用的所有组件(包括主机)
- 找到所有类型的继承了
IDependency
从所有这些组件。 - 自动注册所有这些瞬态的
然后从另一个库(其可以或可以不被由主机应用程序中引用),我有这样的:
Kernel.Bind<IDbContextFactory>().To<DbContextFactory>().InSingletonScope();
这里IDbContextFactory
也是IDependency
,所以它得到了由核心库已经加载,现在我在这里,但有不同的范围(单)注册。
从以往的经验(和稍早测试它)我知道这是在Autofac没有问题,但Ninject给了我这么一个错误信息大约在已经注册了。
理想情况下是最好只覆盖以前的任何注册......“级联式”(缺乏一个更好的短语)..
Ninject现在不支持覆盖开放式泛型绑定有更具体的。 例如:
public interface IFoo<T> { }
public class Foo<T> : IFoo<T> { }
public class StringFoo : IFoo<string> {}
使用这样的:
var kernel = new StandardKernel();
kernel.Bind(typeof(IFoo<>)).To(typeof(Foo<>));
kernel.Bind<IFoo<string>>().To<StringFoo>();
var intFooInstance = kernel.Get<IFoo<int>>();
var stringFooinstance = kernel.Get<IFoo<string>>();
作品。
不过,如果你不是在谈论开放通用的绑定,ninject 3仍采用多重绑定一样ninject 2.2。
在大多数情况下,你可以通过上下文绑定解决这个问题。 好吧,我会不完全称之为一个变通方法,我称之为好的设计。 总的来说,这是说明如下: https://github.com/ninject/ninject/wiki/Contextual-Binding
一个简单的方法是指定使用名称的绑定。 这需要一个指定的一个结合,并允许只有一个,太。 请参阅: https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-constrained-resolution-named-bindings
另外,也可以定义一个“默认”的样结合.Bind<IFoo>().To<Foo>();
和特殊情况下的绑定与.When(...)
语法,如:
.Bind<IFoo>().To<SpecialFoo>().When(ctx => ...)
见https://github.com/ninject/ninject/wiki/Contextual-Binding#specifying-constraints-on-the-type-binding-using-arbitrary-elements-of-the-resolution-request-context
如果您告诉我们您的具体问题,我们或许能提供更具体的解决方案。