Asp.net mvc Ninject 3多个绑定
我的问题实际上是这里发布的一个老问题的重复: 2011年似乎有人要处理这个问题。有人知道有没有办法在Ninject中关闭此类警告?或者其他解决办法 编辑 对于@BatteryBackupUnit,我的问题是: 我有多个图书馆。。。在我的核心库中,我做了如下工作:Asp.net mvc Ninject 3多个绑定,asp.net-mvc,ninject,ninject-3,Asp.net Mvc,Ninject,Ninject 3,我的问题实际上是这里发布的一个老问题的重复: 2011年似乎有人要处理这个问题。有人知道有没有办法在Ninject中关闭此类警告?或者其他解决办法 编辑 对于@BatteryBackupUnit,我的问题是: 我有多个图书馆。。。在我的核心库中,我做了如下工作: 查找主机应用程序(包括主机)引用的所有程序集 查找从所有这些程序集中继承自IDependency的所有类型 自动将所有这些注册为瞬态 然后从另一个库(主机应用程序可能会引用,也可能不会引用)中,我得到以下信息: Kernel.Bind
IDependency
的所有类型Kernel.Bind<IDbContextFactory>().To<DbContextFactory>().InSingletonScope();
Kernel.Bind().To().InSingletonScope();
这里的IDbContextFactory
也是一个IDependency
,因此它已经被核心库加载,现在我在这里注册它,但使用不同的作用域(singleton)
根据经验(以及之前的测试),我知道这在Autofac中是没有问题的,但Ninject给了我关于已经注册它的错误消息
理想情况下,最好只是覆盖以前的任何注册。。。“层叠风格”(缺少更好的短语) Ninject现在支持用更具体的绑定覆盖打开的泛型绑定。 例如:
public interface IFoo<T> { }
public class Foo<T> : IFoo<T> { }
public class StringFoo : IFoo<string> {}
公共接口IFoo{}
公共类Foo:IFoo{}
公共类StringFoo:IFoo{}
用法如下:
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>>();
var-kernel=new-StandardKernel();
Bind(typeof(IFoo)).To(typeof(Foo));
kernel.Bind().To();
var intFooInstance=kernel.Get();
var stringFooinstance=kernel.Get();
工作
但是,如果您不是在谈论开放的泛型绑定,那么ninject 3仍然与ninject 2.2一样处理多绑定
在大多数情况下,您可以通过使用上下文绑定来解决这个问题。好吧,我不会确切地说这是一个解决办法,我会说这是一个好的设计。
一般情况下,这里描述了这一点:
一种简单的方法是使用名称指定绑定。这需要为指定的绑定创建一个绑定,并且也只允许一个绑定。
见:
也可以定义“默认”绑定,如.Bind().to()使用。When(…)
语法的代码>和特殊情况绑定,如:
.Bind().To().When(ctx=>…)
看
如果您向我们展示您的具体问题,我们可能能够提供更具体的解决方案。据我所知,您无法做到“覆盖注册级联样式”——至少不容易做到。然而,我想知道IDependency
的价值是什么。这个接口是用来做什么的?我猜想,通过使用不同的设计,您可以轻松地解决这个难题,而不会使整个软件复杂化。