2

当使用 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>());

我应该如何配置绑定以便只获得一个Serviceninjected 实例?

4

1 回答 1

2

如果有一个组件可以包含在其中两个中,则很可能您的约定不好。但是从这样一个抽象的场景中是无法判断的。您应该考虑一下,例如使用命名约定:

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());
于 2013-10-10T06:26:48.253 回答