Ninject 3多个绑定(Ninject 3 multiple bindings)

2019-10-19 07:24发布

我的问题是真的在这里发布了一个老问题的重复: Ninject 2.2多个绑定

看来有人要对付这个早在2011年有谁知道是否有某种方式来关闭这些警告在Ninject? 或一些其他的解决办法?

编辑

为了应对@BatteryBackupUnit,这里是我的确切问题:

我有多个库......在我的核心库,我做这样的事情:

  1. 查找主机应用程序中引用的所有组件(包括主机)
  2. 找到所有类型的继承了IDependency从所有这些组件。
  3. 自动注册所有这些瞬态的

然后从另一个库(其可以或可以不被由主机应用程序中引用),我有这样的:

Kernel.Bind<IDbContextFactory>().To<DbContextFactory>().InSingletonScope();

这里IDbContextFactory也是IDependency ,所以它得到了由核心库已经加载,现在我在这里,但有不同的范围(单)注册。

从以往的经验(和稍早测试它)我知道这是在Autofac没有问题,但Ninject给了我这么一个错误信息大约在已经注册了。

理想情况下是最好只覆盖以前的任何注册......“级联式”(缺乏一个更好的短语)..

Answer 1:

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

如果您告诉我们您的具体问题,我们或许能提供更具体的解决方案。



文章来源: Ninject 3 multiple bindings