実際には、それについて考えるとコントローラは作業単位で動作するはずです。 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」を実行します。
したがって、作業単位は実際にはサービスまたはリポジトリのどちらにも点ではありません。それは単に管理されている永続化メカニズムで動作します。
「ポイント」はおそらく最良の単語ではありません。私は、サービス層がUoWとリポジトリのインスタンスにアクセスすることを意味しました。だから "ポイント"は "のインスタンスにアクセス"を意味します。とにかく、基本的には、サービス層が作業単位(トランザクションを行うために)とリポジトリのインスタンスを持つ必要があるということですか? – Rushino
説明をありがとう。はい、トランザクションは、ユースケースを満たすためにリポジトリとモデルオブジェクトを使用するサービスに関連付ける必要があります。 – duffymo
答えと詳細をありがとう。 – Rushino