글쎄, 실제로 생각하면 컨트롤러은 작업 단위 (Unit of Work)에서 작동해야합니다. 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는 래퍼로 구현됩니다. 즉, 작업 단위에 대한 "Commit"메소드는 단순히 ObjectContext에 "SaveChanges"를 수행합니다.
따라서 작업 단위는 서비스 또는 저장소에 실제로 이 아닙니다. 관리하는 지속성 메커니즘과 함께 작동합니다.
"가리 키기"가 아마도 가장 좋은 단어는 아닙니다. 서비스 레이어가 UoW 및 Repository의 인스턴스에 액세스한다는 의미였습니다. 따라서 "point to"는 "의 인스턴스에 접근"을 의미합니다. 어쨌든 기본적으로 서비스 계층은 작업 단위 (트랜잭션 수행)와 저장소의 인스턴스를 가져야 함을 의미합니다. – Rushino
설명해 주셔서 감사합니다. 예, 트랜잭션은 유스 케이스를 수행하기 위해 리포지토리 및 모델 객체를 사용하는 서비스와 관련되어야합니다. – duffymo
답변과 세부 정보 주셔서 감사합니다. – Rushino