2014-02-05 58 views
1

我的问题实在是一个老问题的重复张贴在这里: Ninject 2.2 multiple bindingsNinject 3多个绑定

似乎有人去处理这个早在2011年有谁知道是否有某种方式来关闭Ninject的这种警告?或者其他一些解决方法?

编辑

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

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

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

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

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

这里IDbContextFactory也是一种IDependency,所以它已经加载了核心库,现在我注册它在这里,但有一个不同的范围(单身人士)。我知道这在Autofac中是没有问题的,但是Ninject向我提供了关于已经注册的错误信息。

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

+0

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

回答

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

也可以定义一个 “默认” 与.When(...)语法像.Bind<IFoo>().To<Foo>();和特殊情况下的绑定结合,如:

.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

如果你表现出我们你的具体问题,我们可能能够提供更具体的解决方案。

+0

谢谢,请参阅我的编辑 – Matt