当使用ninject约定绑定多个接口的所有实现时,我遇到了以下问题:
public interface IServiceA { }
public interface IServiceB { }
public class Service : IServiceA, IServiceB { }
public class FooA
{
public Foo(IEnumerable<IServiceA> a)
{
// a has 2 instances of Service
}
}
public class FooB
{
public Foo(IEnumerable<IServiceB> b)
{
// b has 2 instances of Service
}
}
// ...
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IServiceA>().
BindAllInterfaces());
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IServiceB>().
BindAllInterfaces());
var a = new FooA(kernel.GetAll<IServiceA>());
var b = new FooB(kernel.GetAll<IServiceB>());我应该如何配置绑定,以便只获得一个Service注入的实例?
发布于 2013-10-10 06:26:48
最相似的是,如果有一个组件可以包含在其中两个中,则您的约定是不好的。但是,从这样一个抽象的情景来看,是不可能的。您应该考虑这一点,例如使用命名约定:
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().EndingWith("Service").
BindAllInterfaces());或者引入一个基本接口:
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IService>().
BindAllInterfaces());或者引入一个属性,按命名空间选择,.有很多种方法。另一种选择是分两个步骤选择类:
kernel.Bind(x => x
.FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceA>()
.Join().FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceB>().
BindAllInterfaces());如果服务类型配置不同,则可以在其中一个绑定中排除特殊情况:
kernel.Bind(x => x
.FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceA>()
.Exclude<Service>().
BindAllInterfaces());https://stackoverflow.com/questions/19271097
复制相似问题