1

ここで説明されているように、Unit of Work/Repository パターンを実装しようとしています: http://blogs.msdn.com/adonet/archive/2009/06/16/using-repository-and-unit-of-work- pattern-with-entity-framework-4-0.aspx

これには、各リポジトリが IUnitOfWork 実装を受け入れる必要があります。たとえば、IUnitOfWork インターフェイスを追加するために部分クラスで拡張された EF データコンテキストです。私は実際には4.0ではなく.net 3.5を使用しています。私の基本的なデータ アクセス コンストラクターは次のようになります。

public DataAccessLayer(IUnitOfWork unitOfWork,
                       IRealtimeRepository realTimeRepository)
{
    this.unitOfWork = unitOfWork;
    this.realTimeRepository = realTimeRepository;
}

ここまでは順調ですね。

私がやろうとしているのは、Unity Framework を使用して依存性注入を追加することです。

Unity で EF データ コンテキストを作成するのは冒険でした。コンストラクターの解決に問題があったためです。最終的に私が行ったことは、新しいオーバーロードされたコンストラクターを使用して部分クラスに別のコンストラクターを作成し、それを でマークすること[InjectionConstructor]でした。

[InjectionConstructor]
public communergyEntities(string connectionString, string containerName)
    : this()
{
    // ...
}

(接続文字列をベースオブジェクトに渡す必要があることはわかっています。これは、すべてのオブジェクトが正しく初期化されるまで待つことができます)

したがって、この手法を使用すると、エンティティ フレームワーク オブジェクトを次のように IUnitOfWork インスタンスとして問題なく解決できます。

using (IUnityContainer container = new UnityContainer())
{
    container.RegisterType<IUnitOfWork, communergyEntities>();

    container.Configure<InjectedMembers>()
        .ConfigureInjectionFor<communergyEntities>
            (new InjectionConstructor("a", "b"))

    DataAccessLayer target = container.Resolve<DataAccessLayer>();

    // ...
}

偉大な。ここで行う必要があるのは、DataAccessLayer のリポジトリ オブジェクトへの参照を作成することです。DAL はインターフェイスを知る必要があるだけなので、Unity Resolve ステートメントの一部としてインスタンス化する必要があると推測しています。 IUnitOfWork インターフェイス。

以前は、Repository コンストラクターに db 接続文字列を渡すだけで、ローカルの Entity Framework オブジェクトを作成し、Repository メソッドの有効期間だけ使用していました。これは、Unity Resolve ステートメント中に Entity Framework インスタンスを IUnitOfWork 実装として作成するという点で異なります。これは、リポジトリのコンストラクターに渡す必要があるインスタンスです。それは可能ですか?

リポジトリをプロパティにして依存関係としてマークできるかどうか疑問に思っていますが、それでも、DAL が解決されている IUnitOfWork オブジェクトを使用してリポジトリを作成する方法の問題は解決しません。

このパターンを正しく理解しているかどうかはわかりませんが、それを実装するための最良の方法についてアドバイスを喜んで受けます. 全体が逆さまになっている場合は、教えてください

4

1 に答える 1

1

これは言い換えられ、ここで回答されました: Unity フレームワーク - インスタンスの再利用

解決策は、ContainerControlledLifetimeManager - 別名シングルトンを使用することです: http://msdn.microsoft.com/en-us/library/dd203242.aspx

于 2010-03-09T21:32:10.757 に答える