UnitOfWork는 일반적으로이 추상화를 제공합니다. 변경해야 할 한 곳이며, 저장소는 인터페이스를 통해 변경됩니다. O / RM을 변경해야하는 경우 새로운 UoW를 구현하십시오. 하나와 완료.
BTW는 단순히 O / RM을 전환하는 것 이상입니다. 단위 테스트를 생각해보십시오. 세 가지 UnitOfWork 구현이 있습니다. 하나는 EF, 하나는 NH (실제로 DID는 Oracle 지원을 원하는 클라이언트를 위해 프로젝트 중간에 O / RM을 전환해야하기 때문)와 InMemory 지속성을위한 것입니다. InMemory 지속성은 데이터베이스를 배치 할 준비가되기 전에 단위 테스트 나 빠른 프로토 타이핑에 완벽했습니다.
프레임 워크는 구현이 간단합니다. 먼저 일반적인 IRepository 인터페이스가 있습니다
public interface IRepository<T>
where T:class
{
IQueryable<T> FindBy(Expression<Func<T,Bool>>filter);
IQueryable<T> GetAll();
T FindSingle(Expression<Func<T,Bool>> filter);
void Add(T item);
void Remove(T item);
}
그리고 IUnitOfWork 인터페이스
public interface IUnitOfWork
{
IQueryable<T> GetSet<T>();
void Save();
void Add<T>(T item) where T:class;
void Remove<T>(T item) where T:class;
}
다음은 기본 저장소입니다 (추상적인지 여부에 대한 선택).
public abstract class RepositoryBase<T>:IRepository<T>
where T:class
{
protected readonly IUnitOfWork _uow;
protected RepositoryBase(IUnitOfWork uow)
{
_uow=uow;
}
public IQueryable<T> FindBy(Expression<Func<T,Bool>>filter)
{
return _uow.GetSet<T>().Where(filter);
}
public IQueryable<T> GetAll()
{
return _uow.GetSet<T>();
}
public T FindSingle(Expression<Func<T,Bool>> filter)
{
return _uow.GetSet<T>().SingleOrDefault(filter);
}
public void Add(T item)
{
return _uow.Add(item);
}
public void Remove(T item)
{
return _uow.Remove(item);
}
}
IUnitOfWork 구현은 EF, NH 및 In Memory에 대한 어린이의 놀이입니다. 내가 IQueryable을 반환하는 이유는 Ayende가 그의 게시물에서 언급 한 것과 같은 이유로 클라이언트가 LINQ를 사용하여 결과를 추가로 필터링, 정렬, 그룹화 및 투영 할 수 있으며 서버 측에서 수행되는 모든 이점을 얻을 수 있습니다.