9

ninject を使用して、特定のジェネリック型のすべてのインスタンスをクラスに注入できるようにしたいと考えています。たとえば、次のような形式のカスタム エクストラクタが多数あります。

public interface IExtract<TEntity> 
{ 
    TEntity ExtractFrom(MyBulkExportedEntity exportedEntity);
}

そして、これらのエクストラクタのすべてのインスタンスを、ninject 複数バインディングを使用して、このファイルの処理を担当するクラスに注入したいと考えています。

すなわち

public class ProcessDataExtract
{
    /*This isn't valid c# but demonstrates the intent of what i would like to do*/
    public ProcessDataExtract(IEnumerable<IExtract<>> allExtractors)
    {
    }

    public void Process(MyBulkExportedEntity exportedEntity)
    {
        /*loop through all of the extractors and pull relevant data from the object*/
    }
}

過去に、カーネルに直接アクセスする管理クラス (IProvideExtractors) を使用してこれを実行しましたが、この方法が気に入らず、これを行うためのより良い方法を誰かが知っているかどうか疑問に思っていました。ninject 複数バインディングを使用すると、使用することに関心のあるすべてのインスタンスを取得できますkernel.GetAll(typeof(IExtract<>))

4

3 に答える 3

3

これに対する答えは、ninjectでこれを行う方法がないということです

于 2012-06-18T09:18:11.057 に答える
1

オプション A

私はあなたがこれを行うことができると確信しています:

public class ProcessDataExtract
{
    public ProcessDataExtract<TExtract>(IEnumerable<IExtract<TExtract>> allExtractors)
    {
    }
    ...etc...
}

Load次に、バインディング モジュールのメソッドでバインディングを一覧表示します。

...
Bind<IExtract<TEntity>>().To<SomeConcreteExtract>();
Bind<IExtract<TEntity>>().To<AnotherConcreteExtract>();
Bind<IExtract<TEntity>>().To<YetAnotherConcreteExtract>();
...

そして、NInject は、それらの束への依存関係をアドバタイズするコンストラクターにそれらを配信します。私は過去にそれを成功させました。

オプション B

変化する

public interface IExtract<TEntity> 
{ 
    TEntity ExtractFrom(MyBulkExportedEntity exportedEntity);
}

public interface IExtract
{ 
    TEntity ExtractFrom<TEntity>(MyBulkExportedEntity exportedEntity);
}

これにより、次のことが可能になります。

        public ProcessDataExtract<TExtract>(IEnumerable<IExtract<TExtract>> allExtractors)
    {
    }
    ...etc...

することが:

    public ProcessDataExtract(IEnumerable<IExtract> allExtractors)
    {
    }
    ...etc...

また、NInject バインディングも調整されます。

...
Bind<IExtract>().To<SomeConcreteExtract>();
Bind<IExtract>().To<AnotherConcreteExtract>();
Bind<IExtract>().To<YetAnotherConcreteExtract>();
...
于 2012-06-07T20:41:48.403 に答える