4

내 현재 응용 프로그램 구조 작업 패턴의 디커플링 단위는 다음과 같습니다닷넷 - 여러 ORM의

  • 모델 조립
  • 데이터 어셈블리
    • 는 ORM에 의해 구현 될 수있는 저장소 인터페이스를 정의
  • ORM 어셈블리
    • 리포지토리 인터페이스를에서 구현합니다. 데이터 어셈블리
    • 이의 종류를 해결하기 위해 단결을 사용 Data.IRepository<>
      • 비즈니스 어셈블리
    • ORM.GenericRepository<>에 대한 참조 데이터 및 모델 어셈블리를 regsister하는 연합 (IoC 컨테이너)를 사용 IRepository<>
  • UI 어셈블리
    • Refe 비즈니스 조립체

을 rences이 구조는 본질적 IRepository<T>를 구현 ORM에서 비즈니스 계층을 분리 하였다.

이 분리 된 구조의 장점 중 하나는 ORM을 비교적 쉽게 대체 할 수 있어야한다는 것입니다. 예를 들어 Entity Framework에서 NHibernate로 이동하거나 기존 ORM을 업그레이드하는 것과 같이 비교적 쉽게 ORM을 대체 할 수 있어야합니다. 저는 현재 EF 4.1 코드를 먼저 사용하고 있고 NHibernate를위한 다른 어셈블리를 만들고 있습니다.

작업 단위 패턴을 구현하는 것이 좋습니다.

이 패턴은 비즈니스 계층 (내 데이터 어셈블리에 정의 된 인터페이스 포함)에서 사용해야하며 저장소 패턴을 사용한 것처럼 ORM 어셈블리에서 구현해야합니다. 현재 모든 인스턴스화 된 리포지토리는 자체 DbContext/세션을 가지며 수명이 리포지토리의 수명으로 설정됩니다. 문제가 될 수 있습니다. 문제가되는 것은 작업 단위 패턴을 구현할 수 있는지 확실하지 않습니다. 다른 ORM (어, 오히려 그것은 아마 내가 속도를 내고있는 것이 아닙니다)입니다.

이 마음에 오는 유일한 방법입니다 :

함수가 내 데이터 어셈블리에 IUnitOfWork 만들기 : object GetCurrentSession();을 다음 ORM 어셈블리의 repositorys의 생성자의 인자를 가지고 있고 그것을 캐스팅 적절한 세션/DbContext (NHibernate가 Entity Framework에서 DbContext 인 경우 Hibernate가 다음 Session 인 경우)

이 상황에 대한 통찰력이 있다면 고맙겠습니다.

I 해결책을 발견 할 수있다

답변

0

은 (아직 시도하지 않은) 다음 ORM 어셈블리

public interface IUnitOfWork : IDisposable 
{ 
    void Start(); 
    T Current<T>(); 
    // IDisposable stuff 
} 

:

public class GenericRepository<T> : IRepository<T> 
    where T : PersistentEntity 
{ 
    private ISession CurrentSession; 

    public GenericRepository(IUnitOfWork uow) 
    { 
     CurrentSession = uow.Current<ISession>(); 
    } 

    // other repository stuff here 
} 

public class NHhibernateUnitOfWork : IUnitOfWork 
{ 
    private ISession CurrentSession; 

    public void Start() 
    { 
     // instantiate CurrentSession 
    } 

    T Current<T>() 
    { 
     if(typeof(T) is ISession) 
     return (T)CurrentSession; 
     else 
     return new NotImplementedException(); 
    } 
} 

// in the prism module 
container.Resolve(typeof(IUnitOfWork), typeof(NHhibernateUnitOfWork)); 

데이터 어셈블리

비즈니스 모임에서 :

IUnitOfWork uow = container.Resolve<IUnitOfWork>(); 
using(uow.Start()) 
{ 
    IRepository custRepo = container.Resolve<IRepository<Customer>>(uow); 
    // do stuff here with cust repo 
} 

이것은 구체적인 구현에서 IUnitOfWork를 분리하는 개념의 증거 일뿐입니다.

+0

아이디어를 보려면 여기를 클릭하십시오 : http://bit.ly/gHLubu. – Steven