2012-02-06 14 views
1

クラスのインスタンスを作成する従来のコードがあります。IOCコンテナを回避する方法

私はアセンブリをスキャンしてインスタンスを作成するためにIOCコンテナを結線しています。しかし、私は設定クラスで特定のクラスが何回も作成されるかもしれないことを発見しました。

ロジックは基本的にクラスタイプの配列をループし、選択したクラスと一致する場合はCreateInstanceを呼び出します。

これは問題ありませんが、その機能を提供するために私が考えることができる唯一の方法は、IOCコンテナを渡して、クラスの新しいインスタンスを提供するResolveを呼び出すことです。

私はこれが真面目だと知っていますが、私はそれを動作させる方法を考えることができません。

+0

あなたはこれらの依存関係のためのコンストラクタ・インジェクションパターンを使用できない理由があります:ここで更新

は一例ですか? – Dervall

+0

約50種類のクラスがあります。これらはプラグインです。ユーザーはプラグインを画面上にドラッグすることができます。新しいインスタンスを作成するときには、作成する必要があります – Jon

+0

レガシーコードで作業しているので、この目的でDIコンテナを使用することは妥当な第一歩です。しかし、それはあなたが終わりたいと思うところではありません。 –

答えて

1

IOCコンテナと新しいインスタンスを必要とするコード間の抽象化レイヤを提供する抽象ファクトリを作成します。これにより、コンテナ依存の呼び出しでコードが散らばってしまうのを防ぎます。

たとえば、「Unity Application Block」を使用する場合は、Func<T>を工場として使用できます。このFunc<T>は、実際にはcontainer.Resolve<T>()のコンテナ実装を非表示にします。

public class TestClass 
{ 
    readonly Func<Foo> _fooFactory; 

    public TestClass(Func<Foo> fooFactory) 
    { 
     _fooFactory = fooFactory; 
    } 

    public void LoadFoo() 
    { 
     var foo = _fooFactory(); // This hides the call container.Resolve<Foo>() 
     // Do something with foo 
    } 
} 
+0

私はオートファックを使用しており、これを行う方法を見つけようとしています... – Jon

+0

Autofacはこの全く同じ機能です。 [here](http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory) – Lukazoid

+0

を参照してください。ドキュメントを読んでいるけど、私はちょうど、blah、blahを見ています:) – Jon

関連する問題