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のインスタンスを 1 つだけ取得するには、バインディングをどのように構成すればよいですか?

4

1 に答える 1

2

ほとんどの場合、それらのうちの 2 つに含めることができるコンポーネントがある場合、規則は適切ではありません。しかし、そのような抽象的なシナリオから判断することは不可能です。それについて考える必要があります。たとえば、命名規則を使用します。

kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().EndingWith("Service").
BindAllInterfaces());

または基本インターフェースを導入します。

kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IService>().
BindAllInterfaces());

または、属性を導入する、名前空間で選択する、....多くの方法があります。もう 1 つのオプションは、2 つのステップでクラスを選択することです。

kernel.Bind(x => x
.FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceA>()
.Join().FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceB>().
BindAllInterfaces());

サービスの種類が異なるように構成されている場合は、バインディングの 1 つで特殊なケースを除外できます。

kernel.Bind(x => x
.FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceA>()
.Exclude<Service>().
BindAllInterfaces());
于 2013-10-10T06:26:48.253 に答える