3

必要になるたびにデータ プロセッサ オブジェクトの新しいインスタンスを作成する小さなクラスがあります。私はすべてに注入を使用していますがIDataProcessingServicekernel.

これを行うより良い方法はありますか。注入するのではなく静的ゲートウェイを作成できることは知っていますが、それは別のスキンでも同じ問題だと思います。

public class DataProcessingManager
{
    private readonly Dictionary<IDataProcessingRequest, IDataProcessingService> _activeProcessingServices;

    private readonly IKernel _kernel;

    public DataProcessingManager(IKernel kernel)
    {
        _kernel = kernel;
        _activeProcessingServices = new Dictionary<IDataProcessingRequest, IDataProcessingService>(new DataProcessingRequestComparer());
    }

    public void ProcessFor(IDataProcessingRequest dataProcessingRequest)
    {
        if (!_activeProcessingServices.ContainsKey(dataProcessingRequest))
        {
            var _processingService = _kernel.Get<IDataProcessingService>();
            _activeProcessingServices.Add(dataProcessingRequest, _processingService);

            _processingService.ProcessingFinished += 
                (sender, args) => _activeProcessingServices.Remove(dataProcessingRequest);

            _processingService.Process(dataProcessingRequest);
        }
    }
}

編集2:

元の提案された実装では必要な新しいインスタンスが作成されなかったため、受け入れられた回答を変更する必要がありました。カーネルを参照することで元の回答を使用できることはわかっていますが、これも私が望んでいるものではありません。最後.ToFactory()に、新しい回答の規則は、それを行うためのより良い方法です。

Foo..Bar拡張機能の作成者に連絡して、コード サンプルが読みにくいので、コード サンプルを更新するよう依頼します。

4

3 に答える 3

4

毎回新しいインスタンスが必要な場合は、Ninject Factory 拡張機能を使用して IKernel に依存しないようにすることができます。

この拡張機能を使用すると、ファクトリ インターフェイスを作成して IDataProcessingService のインスタンスを作成できますが、そのインターフェイスを実装する必要はありません。この拡張機能は、それを実装できます (内部で IKernel を呼び出します)。

工場インターフェース...

public interface IDataProcessingServiceFactory
{
    IDataProcessingService Create();
}

バインド ステートメント (実行時にファクトリ実装を自動生成する)...

kernel.Bind<IDataProcessingServiceFactory>().ToFactory();
于 2013-01-07T16:32:17.340 に答える
1

に「依存」したくない場合はIKernel、サービスを提供する 2 つ目のインターフェイスを作成できます。

interface IDataProcessingServiceProvider
{
    IDataProcessingService GetService();
}

その後、IKernel インターフェイス全体を実装しなくても、カーネルにそのインターフェイスを実装させ、テスト用にスタブ化することができます。

于 2013-01-07T15:50:51.497 に答える
0

一般的なコンセンサスは、アプリケーション ロジックをコンテナーまたはコンテナーの抽象化に依存させるのは良くないということです。ただし、インフラストラクチャ コンポーネントをコンテナーに依存させることは問題ありません。

ただし、アプリケーション ロジックとインフラストラクチャ ロジックを混在させないようにしてください。秘訣は、多くの場合、クラスを純粋なアプリケーションまたは純粋なインフラストラクチャにできる方法で抽出することです。

于 2013-01-07T16:08:57.310 に答える