私の現在のアプリケーション構造は次のとおりです。
- モデルアセンブリ
- データアセンブリ
- ORMによって実装されるリポジトリインターフェイスを定義します
- ORMアセンブリ
- データアセンブリからリポジトリインターフェイスを実装します
- Unity(IoCコンテナ)を使用して登録
Data.IRepository<>
しますORM.GenericRepository<>
- 商談
- データアセンブリとモデルアセンブリを参照します
- Unityを使用してタイプを解決します
IRepository<>
- UIアセンブリ
- ビジネスアセンブリを参照します
この構造は、本質的にビジネス層をORMから切り離して実装していIRepository<T>
ます。
この分離された構造の利点の1つは、ORMを比較的簡単に置き換えることができることです。たとえば、Entity FrameworkからNHibernateに移行したり、既存のORMをアップグレードしたりできます。私は現在、最初にEF 4.1コードを使用しており、NHibernate用に別のアセンブリを構築しています。
作業単位パターンの実装を検討しています。
このパターンはビジネスレイヤーで使用する必要があることを読みました(データアセンブリで定義されたインターフェイスを使用し、リポジトリパターンで行ったのと同じようにORMアセンブリに実装します)。現在、インスタンス化されたすべてのリポジトリには独自のDbContext /セッションがあり、その存続期間はリポジトリの存続期間に設定されています-これは悪いかもしれません-私の問題は、で動作する作業単位パターンを実装できるかどうかわからないことです異なるORM(むしろ、おそらくそうですが、私はスピードが上がらないだけです)。
これが頭に浮かぶ唯一のことです:
次の関数を持つデータアセンブリにIUnitOfWorkを作成します。object GetCurrentSession();
次に、ORMアセンブリのリポジトリのコンストラクターに引数を設定し、適切なセッション/ DbContextにキャストします(NHibernateの場合はISession、Entity Frameworkの場合はDbContext)
誰かがこの状況について何らかの洞察を持っていれば幸いです。