2

私は現在、6つのレイヤーで構成されるWebアプリに取り組んでいます。

  • Web(ViewModelsおよびControllersへの参照)
  • ViewModels
  • コントローラー
  • サービス(データとエンティティへの参照)
  • データ(エンティティへの参照)
  • エンティティ

私がしようとしているのは「UnitOfWork」パターンを実装することです。したがって、そのジョブに対してDIによって注入されるクラスがあります。これにより、終了時にコントローラーのactionresultで.commit()を実行できます。データベース。

ここで私の質問です...このUnitOfWorkクラスはどこに配置する必要がありますか?現時点ではデータレイヤーにありますが、コントローラーレイヤーがデータレイヤーとサービスレイヤーを参照する必要があります。これは私の意見では奇妙です... UnitOfWorkクラス/インターフェイスをサービスレイヤーに移動してDIを使用する必要がありますか?

4

3 に答える 3

5

データレイヤーでリポジトリパターンを使用していない限り、時間を無駄にしていることになります。

UoWのポイントは、複数のリポジトリインスタンス間で変更を処理することです。これは、次の方法で行われます。

  1. 作業単位は、実際の基礎となるコンテキストから派生します(DataContext-L2SQL、ObjectContext / EF)
  2. リポジトリは、そのctorで作業単位を取ります。

作業単位は2つのことを行います。

  1. 方法がCommit()ある
  2. 基になるオブジェクト/エンティティセットをリポジトリに公開します。

すべてをセットアップするのは少し難しいですが、一度セットアップすると、フローは次のようになります。

  1. コントローラは、サービスと作業単位をDIします(両方ともインターフェイスを介して)
  2. コントローラがサービスのメソッドを呼び出す( "CustomerServices.AddOrder()")
  3. サービスはリポジトリのメソッドを呼び出します
  4. リポジトリは、「Order」オブジェクト/エンティティセットに対して「Add」メソッドを呼び出します
  5. コントローラーは作業単位をコミットします

基本的に、各レイヤーはコンストラクターの「次のレイヤー」のインスタンスを取ります。すべてがDIされ、インターフェース駆動型である必要があります。UoWは何にも依存していませんが、リポジトリは「内部メモリ」(ORM)への永続性を依存しています。その後、UoWの「コミット」は変更をデータベースにプッシュします(基本的に「SaveChanges」メソッドをラップします)。

作業単位はインフラストラクチャ/永続性/データベース/トランザクションの問題であるため、データ層に配置する必要があります。コントローラのみが参照する必要があります。

于 2011-02-08T20:59:47.250 に答える
0

クラスを実装IUnitOfWorkして、MVCコントローラーに直接渡されました(Castle Windsorを介して注入されました)。次に、コントローラーに、インスタンス化するすべてのサービスオブジェクトにそれを渡してもらいます。

于 2011-02-08T20:38:39.340 に答える
0

IUnitOfWorkは、データレイヤーのインターフェイスである必要があります。リクエストがControllerに入ったら、サービスメソッドを呼び出します。CRUDが必要な場合は、UnitOfWorkを呼び出す必要があります。Global.asax Request_StartでUnitOfWorkを呼び出し、Request_Endで作業をコミットすることにより、SessionPerRequestを使用できます。

于 2011-02-08T20:46:47.750 に答える