【问题标题】:Ninject 3 multiple bindingsNinject 3 多重绑定
【发布时间】:2014-02-05 10:40:12
【问题描述】:

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

似乎有人要在 2011 年处理这个问题。有谁知道是否有办法在 Ninject 中关闭此类警告?或者其他一些解决方法?

编辑

针对@BatteryBackupUnit,这是我的确切问题:

我有多个库...在我的核心库中,我执行以下操作:

  1. 查找宿主应用程序(包括宿主)引用的所有程序集
  2. 从所有这些程序集中查找从IDependency 继承的所有类型。
  3. 自动将所有这些注册为瞬态

然后从另一个库(主机应用程序可能会或可能不会引用),我有这个:

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

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

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

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

【问题讨论】:

  • 据我所知,你不能做“覆盖注册级联样式”——至少不容易。但是我想知道IDependency 的价值是什么。这个接口是干什么用的?我怀疑您可以通过使用不同的设计轻松解决挑战 - 而不会使整个软件复杂化。

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


【解决方案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&lt;IFoo&gt;().To&lt;Foo&gt;();,以及使用.When(...) 语法的特殊情况绑定,如:

.Bind&lt;IFoo&gt;().To&lt;SpecialFoo&gt;().When(ctx =&gt; ...)

https://github.com/ninject/ninject/wiki/Contextual-Binding#specifying-constraints-on-the-type-binding-using-arbitrary-elements-of-the-resolution-request-context

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多