0

Unityコンテナが初めてなので、これにどのようにアプローチすればよいか非常にわかりません。

ここに私が持っている工場があります:

 class DataCopierFactory : IDataCopierFactory
{
    private readonly IUnityContainer _container;
    //not mad on binding the factory to the container, but feck it
    public DataCopierFactory(IUnityContainer container)
    {
    _container = container;

    }

    //return a data copier that will transfer data from any DB to any other DB
    public IDataCopier createDataCopier(int i)
    {
        switch(i)
        {
            case 1:
                return new ScheduleDataCopier(new LTEEFContext());  //somehow resolve the LTEEFContext..
            //case 2:
            //    
            default:
                throw new InvalidOperationException("Parameter -t=" + i + " does not exist");

        }
    }
}

createDataCopier メソッドを呼び出していくつかの列挙型を渡すときに、Unity コンテナーを使用して、さまざまなタイプの IDataCopier の DB オブジェクト コンテキストを解決したいと考えています。

どうすればいいですか?

ファクトリを呼び出すクラスで行う必要がありますか? または、unitycontainer を注入し、その時点で異なる DB オブジェクト コンテキストを解決します。

IDatacopier の各実装には、コンストラクターとして使用される IDBContext があります。基本的にこれを注入したいのですが、Datacopier のさまざまな実装のコンテキストを変更できるようにします。

うまくいけば、これは理にかなっています... :) 前もって感謝します ニール

4

3 に答える 3

1

答えが見つかりました..それは私のせいでした:)

私はすべきではないときに、依存関係としてobjectContextを注入しようとしていました。工場にIOCコンテナのインスタンスが必要だとは思いません。

また、Repository パターンを使用しています。各 DataCopier impl は、必要なそれぞれのリポジトリのインスタンスをすべて持っているため、ObjContext のインスタンスを必要としません。

レポをデータコピークラスに結合しているため、これは最善の方法ではないかもしれませんが、レポとオブジェクトコンテキストの間に抽象化が既に存在するため、問題はないと思います(Unityを使用してオブジェクトコンテキストを依存関係としてすべてに注入しますレポの)

どんな提案も歓迎..

于 2012-11-21T15:23:27.200 に答える
0

OPがこれを自分で解決したことを確認できてうれしいです。人々がまだ興味を持っている場合は、次のような問題を解決する方法の広範な例があります。ランタイム値/

于 2015-07-02T18:33:48.770 に答える
0

IDataCopier に対して複数の Unity 登録を行うことをお勧めします (実装ごとに)。IDataCopier[] のコンストラクタ パラメータを取得することで、それらすべてをファクトリに注入できます。 注: Unity では、複数登録する場合、各登録に名前を付ける必要があります。

次に、必要なものを選択する方法が必要です。IDataCopier インターフェイスに、int または string タグの get プロパティを追加することをお勧めします。createDataCopier(int) は、Unity から取得した IDataCopier[] に対して get プロパティ == int i を持つ要素をクエリできます。これは「戦略パターン」であり、静的な switch ステートメントよりも柔軟性があります。IDataCopier[] をディクショナリ フィールドに格納すると、選択が容易になりますが、単純な LINQ ステートメントでも機能します。

于 2014-08-18T19:09:36.230 に答える