2011-10-23 3 views
3

저는 데이터 액세스를 위해 저장소를 사용하고 있지만 작업 단위 패턴과 비슷한 것을 전혀 구현하지 못했습니다. 저는 RavenDB와 ASP.NET MVC (이론상 사소한 세부 사항)를 사용하여 자체 교육을위한 새로운 프로젝트를 시작했으며 비즈니스 트랜잭션 (이 아닌 웹 요청)을 자체적으로 랩 할 수있는 좋은 방법을 찾고 있습니다. 작업 단위는 있지만 작업을 수행하는 데 약간의 어려움이 있습니다. 나는 '작업 단위의 데이터 컨텍스트를 리포지토리에 전달

public interface IUnitOfWork : IDisposable 
    { 
     void Commit(); 
    } 

    public class UnitOfWork : IUnitOfWork 
    { 
     private readonly IDocumentSession _session; 

     public UnitOfWork(IDocumentStore documentStore) 
     { 
      _session = documentStore.OpenSession("http://from:config"); 
     } 

     public void Commit() 
     { 
      _session.SaveChanges(); 
     } 

     public static IUnitOfWork Begin() 
     { 
      return IoC.GetInstance<IUnitOfWork>(); 
     } 

     public void Dispose() 
     { 
      _session.Dispose(); 
     } 
    } 

:

public class UserService : IUserService 
    { 
     private readonly IRepository<User> _userRepository; 
     private readonly IRepository<Role> _roleRepository; 

     public UserService(
       IRepository<User> userRepository, 
       IRepository<Role> roleRepository) 
     { 
      _userRepository = userRepository; 
      _roleRepository = roleRepository; 
     } 

     public void Register(User user) 
     { 
      using (var session = UnitOfWork.Begin()) 
      { 
       _userRepository.Create(user); 
       _roleRepository.AddToRole(user, Role.Public); 
       session.Commit(); 
      } 
     } 
    } 

작업 인터페이스의 단위에서 나의 첫번째 찌르기는 다음과 같은 :

다음 코드는 내가 볼 같은 을 거라고 것입니다 stuck은 데이터베이스 세션에 대한 리포지토리의 액세스입니다. 앞서 언급 한대로 비즈니스 거래을 자체 단위로 포장하고 싶습니다. 나는 또한 세션/컨텍스트를 각 메소드에 전달하는 것에 열중하지 않으며, 내가 본 대부분의 다른 솔루션은 웹 세션과 같은 방식으로 정적 메소드 및/또는 저장소를 사용합니다. 이들 모두는 나를 조금 불편하게 만듭니다. 이 전체적인 Unit of Work 개념에 빠져있는 중요한 열쇠가 있습니까?

+1

두 가지 추가 옵션이 있습니다. 1. 비즈니스 트랜잭션 관리로 .Net Distributed Transaction (TransactionScope)을 사용합니다. 기술에 제한이 없으며 세션이나 컨텍스트 정보를 전달할 필요가 없습니다. 2. Commit 메서드에서 변경, 추가, 제거, 수정 한 모든 변경 내용을 추적하고 이러한 모든 변경 사항을 조정하는 사용자 지정 UnitOfWork 구현을 디자인합니다. –

답변

1

나는 TransactionScope 개념을 좋아하지 않으며, 더 많은 연구 & 토론은 내가하고 싶은 일이 단순히 실현 가능하지 않다는 것을 믿게했다.

결국 UnitOfWork의 문맥 내의 리포지토리는 UnitOfWork에 대해 (명시 적으로) 알 필요가 있습니다. 나는 아직 가야 할 길에 정착하지 않은,하지만 난 다음 중 하나처럼 뭔가를 할거야 :

using (var session = UnitOfWork.Begin()) 
      { 
       _userRepository.Use(session).Create(user); 
       _roleRepository.Use(session).AddToRole(user, Role.Public); 
       session.Commit(); 
      } 

또는

using (var session = UnitOfWork.Begin()) 
      { 
       session.Get<IUserRepository>().Create(user); 
       session.Get<IRoleRepository>().AddToRole(user, Role.Public); 
       session.Commit(); 
      } 

나도 접근 방식에 대한 미치지 않았어 ; 나는 이것을 더 좋은 제안을받을 때까지 대답으로 표시 할 것이다.

0

Julia Lerman은 Entity Framework를 사용하여 작업 단위 (Unit of Work)의 훌륭한 예제를 제공합니다.

엔티티 프레임 워크에서는 컨텍스트에서 지원되므로 작업 단위를 구현하는 것이 매우 쉽습니다. 제가보기에는 주된 문제는 어떻게 주문을 관리 하느냐입니다. 예 : 표 A 및 표 B

표 B에는 표 A에 대한 외부 키가 있습니다. 작업 단위는 그렇지 않으면 오류가 발생할 수 있습니다. Nhibernate 또는 EF처럼 OR/M을 사용합니다. 훨씬 쉽게 만들어야합니다.

+0

특정 OR/M 구현에 묶이기를 원하지 않습니다. – egoodberry

관련 문제