2011-01-26 5 views
4

엔티티 프레임 워크가있는 ASP.NET MVC3 환경에서 궁금합니다. 작업 단위 (Unit of Work)가 서비스 계층 또는 저장소를 가리키고 (저장소가 서비스 계층을 가리킴) 작품의 기기와 모두가 서비스 계층에 대한 인스턴스가 리포지토리작업 단위 (UOW)가 서비스 계층 또는 저장소를 가리 킵니까?

  • 하나 ..

링크 : 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-의 워크 - 패턴 -와 엔티티 프레임 워크 -4- -0.aspx

무엇이 좋을까요?

감사합니다.

답변

2

"가리킨다"는 것이 확실하지 않지만 트랜잭션은 지속성이 아니라 서비스 계층의 책임이라고 생각합니다.

지속성 오브젝트는 더 큰 작업 단위 (UOW)의 일부인지 여부를 알 수 없습니다. 책임 서비스에는 작업 단위를 구성하는 모든 모델 및 지속성 오브젝트에 대한 참조가 있습니다. 이 서비스는 지속성 객체를 대신하여 풀에서 연결을 관리합니다. 연결을 얻고, 트랜잭션을 열고, 작업을 수행하고, 트랜잭션을 커밋 또는 롤백하고, 연결을 닫습니다. 그것이 그 서비스의 일입니다.

+0

"가리 키기"가 아마도 가장 좋은 단어는 아닙니다. 서비스 레이어가 UoW 및 Repository의 인스턴스에 액세스한다는 의미였습니다. 따라서 "point to"는 "의 인스턴스에 접근"을 의미합니다. 어쨌든 기본적으로 서비스 계층은 작업 단위 (트랜잭션 수행)와 저장소의 인스턴스를 가져야 함을 의미합니다. – Rushino

+1

설명해 주셔서 감사합니다. 예, 트랜잭션은 유스 케이스를 수행하기 위해 리포지토리 및 모델 객체를 사용하는 서비스와 관련되어야합니다. – duffymo

+0

답변과 세부 정보 주셔서 감사합니다. – Rushino

4

글쎄, 실제로 생각하면 컨트롤러은 작업 단위 (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"를 수행합니다.

따라서 작업 단위는 서비스 또는 저장소에 실제로 이 아닙니다. 관리하는 지속성 메커니즘과 함께 작동합니다.

+1

내가보기에 유일한 문제는 컨트롤러가 일반적으로 특정보기 (예 : 브라우저 대 데스크톱)에 밀접하게 연결되어 있다는 것입니다. 따라서 뷰를 변경하면 모든 트랜잭션 논리를 다시 코딩해야합니다. UI 또는 컨트롤러에 대해 생각하지 않고 서비스 지향 아키텍처에서 서비스를 제공하려면 어떻게해야합니까? 이러한 서비스는 트랜잭션을 신경 쓰지 않습니까? 나는 이것이 SOA에 관한 것이고 UI에 관한 것보다 적어야한다고 생각한다. – duffymo

+0

나쁘지는 않지만, 사실 나는 대답을 모두 좋아합니다. 그러나, 메신저는 여전히 올바른 경로를 확신하지 못합니다. @ RPM1984 당신의 권리는 작업 단위가 단순히 그의 목표이지만 duffymo가 UI 나 컨트롤러없이 서비스를 노출하고 싶다면 잘못하지 않는다고 생각하기 때문에 지속성 메커니즘으로 간단하게 작동해야한다는 말이다. 컨트롤러. 이런 종류의 질문에 대답하기에는 불안해 보입니다. 건축에 의존할까요? 필자는 또한 저장소가 작업 단위에 설정된 일부 장소를 보았습니다. – Rushino

+0

다른 사람들의 질문과 글을 읽는 동안, 어떤 사람들은 Single responsbility 원칙을 위반할 것이기 때문에 컨트롤러가 작업 단위에 대해 알지 않아야한다고 말하는 경향이 있습니다. 서비스조차도 그것에 대해 알지 못합니다. 실제로 그들은 application_startrequest와 application_endrequest에 hanlded해야한다고 말한다. 이것에 대해 어떻게 생각하세요? – Rushino

관련 문제