2011-01-26 10 views
4

エンティティフレームワークを使用したASP.NET MVC3環境では不思議です。 Unit of Workがサービスレイヤまたはリポジトリをポイントする必要があります(そして、リポジトリがサービスレイヤを指す)か?作業単位との両方がサービス層にインスタンスを持っているリポジトリ作業単位がサービス層またはリポジトリを指しているか?

  • ワン...

リンク:Entity Framework 4 CTP 4/CTP 5 Generic Repository Pattern and Unit Testable

は使用しません

アイブ氏は、二つの例を見てそのような場合にはサービス層であることは明らかです。

  • 作業単位がサービス層にインスタンスがリポジトリにインスタンスを有する第二..

リンク:http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-の作業-パターン-WITH-エンティティフレームワーク4 -0.aspx

何が良いでしょうか?

ありがとうございました。

答えて

2

「ポイント」とは何を意味するのかよく分かりませんが、トランザクションはサービス層の責任であり、永続性はありません。

永続オブジェクトは、それがより大きい作業単位の一部であるかどうかを知ることができません。責任あるサービスは、作業単位を構成するすべてのモデルおよび永続オブジェクトへの参照を持ちます。サービスは、永続オブジェクトに代わってプールからの接続を管理する役割も担います。接続の取得、トランザクションのオープン、作業の実行、トランザクションのコミットまたはロールバック、および接続のクローズ。それがサービスの仕事です。

+0

「ポイント」はおそらく最良の単語ではありません。私は、サービス層がUoWとリポジトリのインスタンスにアクセスすることを意味しました。だから "ポイント"は "のインスタンスにアクセス"を意味します。とにかく、基本的には、サービス層が作業単位(トランザクションを行うために)とリポジトリのインスタンスを持つ必要があるということですか? – Rushino

+1

説明をありがとう。はい、トランザクションは、ユースケースを満たすためにリポジトリとモデルオブジェクトを使用するサービスに関連付ける必要があります。 – duffymo

+0

答えと詳細をありがとう。 – Rushino

4

実際には、それについて考えるとコントローラは作業単位で動作するはずです。 HTTPリクエストが入ってきたときに典型的にはASP.NET MVCアプリケーションでは、コントローラは、新しい作業単位が割り当てられ

次に、コントローラは、(リポジトリ上のメソッドを呼び出した)サービスのメソッドを呼び出しますEntity Frameworkの内部グラフ/メモリを取得して変更します。

コントローラは、実行する必要があることを実行すると、作業ユニットで「コミット」を実行します。その結果、データベースにコミットされる基になるリポジトリに変更が加えられます。

「サービス」について言えば、コントローラとリポジトリの間に中間層があり、コントローラがサービスとしか話していない場合、サービスはリポジトリと話し合い、次にアプリケーションスタックをバックアップします。

だからあなたのコントローラは、次のようになります。ほとんどのEF4のシナリオで

public class ProductsController : Controller 
{ 
    private IUnitOfWork _unitOfWork; 
    private IProductsService _service; 

    public ProductsController(IUnitOfWork unitOfWork, IProductsService service) 
    { 
     // use dependency injection here 
     _unitOfWork = unitOfWork; 
     _service = service; 
    } 

    [HttpPost] 
    public ActionResult SubmitOrder(Product p) 
    { 
     var existingProduct = _service.FindById(p.ProductId); 
     UpdateModel(existingProduct); 
     _unitOfWork.Commit(); 
    } 
} 

は、作業ユニットはObjectContextはのラッパーとして実装されています。つまり、作業ユニットの「コミット」メソッドは単にObjectContextに「SaveChanges」を実行します。

したがって、作業単位は実際にはサービスまたはリポジトリのどちらにもではありません。それは単に管理されている永続化メカニズムで動作します。

+1

これは、コントローラが一般的に特定のビュー(ブラウザとデスクトップなど)に密接に結びついているという唯一の問題です。だからあなたはビューを変更する場合は、すべてのトランザクションロジックをrecodeする必要がありますか?また、UIやコントローラを意識することなく、サービス指向のアーキテクチャでサービスを公開したい場合はどうすればよいでしょうか?これらのサービスはトランザクションを気にしませんか?私はそれがSOAとUIに関するより多くのものでなければならないと思う。 – duffymo

+0

悪くない、実際には私は両方の答えが大好きです。しかし、私はまだ正しい道のりを確信していません。 @ RPM1984あなたの目標は、UIやコントローラなしでサービスを公開したいのであれば、彼のゴールだがduffymoは間違っているとは言えないので、作業単位は永続性メカニズムで単純に機能するはずですコントローラ。この種の質問に答えるのが不安だと思われます。それは建築にかかっていますか?また、作業単位にリポジトリが設定されている場所もありました。 – Rushino

+0

いくつかの質問と記事を読んでいるうちに、コントローラは単体責任の原則に違反するため、作業部隊について知ってはいけないと言う傾向があります。サービスさえそれについて知ってはいけません。実際には、application_startrequestとapplication_endrequestにhanldedを指定する必要があります。あなたはこのことについてどう思いますか ? – Rushino

関連する問題