2013-09-04 2 views
3

Martin Fowler가 정의한 저장소는 메모리 내 도메인 개체 컬렉션처럼 작동해야합니다. 이것은 응용 프로그램이 (이론 상으로는) 영속성 메커니즘을 모르는 것입니다.다른 데이터 소스에 대한 리포지토리 구현 혼합

그래서 정상적인 상황에서이 같은이있을 것이다 :

public void MyBusinessLogicMethod() { 
    ... 
    IRepository<Customer> repository = myIocContainer.Resolve<IRepository<Customer>>(); 
    repository.Add(customer); 
} 

경우 삽입/당신이 원하는 그 중 하나가 실패 할 경우 롤백하는 메커니즘을 원하는 업데이트의 시리즈를 가지고 있지만 당신이 당신의 고객 저장소가 SQLSERVER 데이터베이스에 대해 행동을했던 일부 기괴한 요구하는 Postg에 대한 MySQL 데이터베이스에 대한 주문 저장소와 송장 저장소가 있다면 그러나

public void MyBusinessLogicMethod() { 
    ... 
    using (IUnitOfWork uow = new UnitOfWork()){ 
     IRepository<Customer> customerRepo = myIocContainer.Resolve<IRepository<Customer>>(uow); 
     customerRepo.Add(customer); 

     IRepository<Order> orderRepo = myIocContainer.Resolve<IRepository<Order>>(uow); 
     orderRepo.Add(order); 

     IRepository<Invoice> invoiceRepo = myIocContainer.Resolve<IRepository<Invoice>>(uow); 
     invoiceRepo.Update(invoice); 

     uow.Save(); 
    } 
} 

: 당신은 UnitOfWork에 구현 어떤 종류의 필요 했어 reSQL 데이터베이스, 각 데이터베이스 세션에 대한 트랜잭션 처리 방법은 무엇입니까?

이제는 약간의 인위적인 예제입니다. 그러나 필자가 경험 한 모든 저장소 구현은 특정 레벨에서 실제로 사용되는 특정 데이터베이스 및 ORM임을 알고있는 것 같습니다.

하나는 데이터베이스로 가고 다른 하나는 웹 서비스를 호출하는 두 개의 리포지토리가있는 또 다른 시나리오를 상상해보십시오. 저장소의 요점은 응용 프로그램이 어떤 데이터 소스에 관심을 기울이지 않아도되지만 엄청나게 뛰어 넘지 않고 응용 프로그램이 어떤 수준에서 알지 못하는 경우 이러한 시나리오를 어떻게 설명 할 수 있는지를 알지 못한다는 것입니다. "FYI this is 데이터 소스 x로 이동하여 다르게 처리하는 것이 좋습니다. "

이 문제를 해결하는 패턴 또는 구현이 있습니까? 데이터베이스 x와 ORM y를 전체 애플리케이션에 사용하는 경우 Repositories는 훌륭하게 작동하지만, 기술적 부채로 인해 프로세스가 빗 나갈 경우 리포지토리의 이점이 크게 감소합니다.

+0

나는 그걸 가지고 놀 이유가 한번도 없었는데, 이것은 [DTC] (http://msdn.microsoft.com/en-us/library/ms679938.aspx)가 해결해야 할 문제라고 생각됩니다. 솔루션의 일부가''SessionScope' (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx) 대신'ISession.BeginTransaction()'을 사용하고 있습니다. 내가 아는 한 많이. –

+0

그렇습니다. TransactionScope는보아야 할 것입니다. 이것은 오히려 연결 및 DbConnection 구현 일이며 모든 공급자는 2 단계 커밋을 지원해야합니다. nhibernate와 아무 관련이 없습니다. – yonexbat

+0

흥미 롭습니다. 자신의 코드를 작성하여 TransactionScope에서 관리 할 수있는 방법이 있습니까? 메모리에있는 콜렉션을 상대로 내 저장소를 조롱하면 TransactionScope에 참여할 수 있을까요? – David

답변

0

제안 된대로 UnitOfWork에서 TransactionScope 트랜잭션을 사용해야합니다. 귀하의 경우 MSDTC로 승격되고 커밋 또는 롤백하기 전에 모든 참여 작업이 올바르게 실행되는지 확인하십시오.

관련 문제