Ninject 3多重绑定

时间:2014-02-05 10:40:12

标签: asp.net-mvc ninject ninject-3

我的问题实际上是这里发布的旧问题的重复: Ninject 2.2 multiple bindings

似乎有人会在2011年处理这个问题。有谁知道在Ninject中是否有某种方法可以关闭此类警告?还是其他一些解决方法?

修改

回应@BatteryBackupUnit,这是我的确切问题:

我有多个库......在我的核心库中,我做了类似的事情:

  1. 查找主机应用程序(包括主机)引用的所有程序集
  2. 从所有这些程序集中查找从IDependency继承的所有类型。
  3. 自动将所有这些注册为瞬态
  4. 然后从另一个库(主机应用程序可能引用或未引用),我有这个:

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

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

    根据经验(并且之前已经测试过)我知道这在Autofac中没有问题,但是Ninject给了我关于已经注册它的错误消息。

    理想情况下,最好只覆盖以前的任何注册......“级联风格”(缺少更好的短语)..

1 个答案:

答案 0 :(得分:0)

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

如果您向我们展示您的具体问题,我们可能会提供更具体的解决方案。