7

저는 Tim McCarthy의 awesome book on DDD in .NET을 읽었습니다. 그러나 그의 예제 애플리케이션에서는 그의 기본 데이터 액세스가 SqlCE를 사용하고 있으며 SQL 인라인을 손수 제작하고 있습니다.DDD 기반 계층화 된 아키텍처에서 Model & DataAccess 레이어간에 LINQ를 사용하기위한 권장 패턴이 있습니까

저는 Entity Framework를 활용하기 위해 몇 가지 패턴을 사용해 왔지만 IRepository linq 쿼리를 기본 데이터 액세스 레이어에 정확히 매핑하는 방법에 대해 고민하고 있습니다.

나는 구체적인 저장소 구현을 가지고있다. 내 EF 모델에서

public EFCustomerRepository : IRepository<DomainEntities.Customer> 
{ 
    IEnumerable<DomainEntities.Customer> GetAll(
        Expression<Func<DomainEntities.Customer, bool>> predicate) 
    { 
     //Code to access the EF Datacontext goes here... 
    } 
} 

, 나는 POCO 엔티티를 사용하고 있지만 내 DomainEntity.Customer & 내 DataAccessLayer.Customer 객체 사이의 기본 매핑 할 수없는 것으로거야 심지어 있도록.

그래서 난 그냥 Expression<Func<T, bool>> predicate =>Expression<Func<TOTHER, bool>> predicate

아니면 내가 이것에 대해 갈거야 모든 잘못을지도 할 수있는 쉬운 방법이있는 EFContext.Customers.Where(...);

에 대한 매개 변수로 Expression<Func<DomainEntities.Customer, bool>> predicate을 전달할 수 없습니다? 제안/의견을 보내 주시면 감사하겠습니다.

+2

도메인 개체 * 및 * 데이터 레이어 개체를 사용 하시겠습니까? 이것은 특히 POCO 엔티티를 사용하기 때문에 중복되는 것처럼 보입니다. AFAIK DDD에 대한 전체적인 생각은 도메인에 대해 하나의 정의를 정의하고 전체 응용 프로그램에서 사용할 수있게하는 것입니다. – Steven

답변

2

예제에서 제공된 코드에서 일반 저장소 패턴을 사용하지 않는 것 같습니까?

http://average-uffe.blogspot.com/2011/03/repository-pattern-with-ef-code-first.html

나는 해당 게시물에서 Expression<Func<DomainEntities.Customer, bool>> 이없는,하지만 난 항상에서 찾기 metod이 ... 나는 EF CodeFirst 사용 (하지만 구 EF 작동) 일반적인 저장소 패턴 IRepository<T> 인터페이스.

인터페이스 :

IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100); 

그리고 추상적 인 baserepository의 구현 : 지금

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100) { 
    return this.DataContext.DbSet<T>().Where(expression).Take(maxHits); 
} 

그리고 당신은 람다 식에 의한 법인에서 찾기 호출 할 수 있습니다 ...

I 당신이 그것을 제대로하지 못한다면 완전한 예를 게시 할 수 있습니다.

3

그런 경우 하나의 표현식 트리에 대한 사용자 지정 변환기를 매핑 논리를 완전히 포함하는 다른 하나 (아마도 둘 이상)로 구현해야합니다. 일반적으로 표현식은 바로 스펙 (스펙 패턴)이며, 스펙을 표현식으로 변환해야합니다.

btw. 그건 잘못 됐어. 별도의 데이터 액세스 레이어 개체가 없어야합니다. 데이터 액세스 레이어는 도메인 개체를 직접로드하고 저장해야하지만 EF는 매핑 기능이 제한되어 있고 자체 요구 사항을 엔터티에 푸시하기 때문에 올바르게 처리 할 수 ​​없습니다. DDD를 심각하게하기 원한다면 (책으로) NHibernate 나 다른 ORM을 체크해야한다.

+0

감사합니다. 훌륭한 의견입니다!하지만 Exrepssion을 사용하여 AST 변환을 작성하는 방법이 궁금합니다. 읽을만한 좋은 예, 오픈 소스 프로젝트 또는 책을 제공 할 수 있습니까? 정말 빨리 구현해야합니다 :) – ajukraine

관련 문제