2010-06-28 4 views
1

EF 4.0에 대한 리포지토리 패턴을 사용할 때 함수 가져 오기 기능을 어떻게 구현했는지 조언 할 수 있습니까?Entity Framework 4.0의 함수 가져 오기 및 리포지토리 패턴

우리는 후보 엔티티에 매핑 된 테이블과 후보로 매핑되는 기존 sproc의 함수 가져 오기를 가지고 있습니다. 이것은 EF에서 훌륭하게 작동하지만, 우리는 그들의 생성자 인 IObjectSet을 취하는 Repositories를 사용하여 추상화합니다. 여기서 T는 POCO 엔티티입니다. 그러나 이것은 함수 가져 오기에 대한 참조를 얻을 수 없다는 것을 의미합니다. 필자가 볼 수있는 유일한 방법은 필요로하는 저장소에 대한 ObjectContext에 대한 참조를 전달하는 것입니다.하지만 이것은 약간의 디자인 냄새처럼 느껴집니다.

여러 저장소가 맞춤 인터페이스로 확장 되어도 여전히 동일한 문제가 있습니다.

public class CandidateRepository : Repository<Candidate>, ICandidateRepository 
{ 
    public CandidateRepository(IObjectSet<Candidate> entities) 
     : base(entities) 
    { 
    } 

    public Candidate GetByEmail(string email) 
    { 
     return Entities.SingleOrDefault(c => c.EmailAddress.Equals(email)); 
    } 

    public bool CandidateExists(string candidateNumber) 
    { 
     return Entities.SingleOrDefault(c => c.Number.Equals(candidateNumber)) != null; 
    } 

    public Candidate GetByNumber(string number) 
    { 
     return Entities.SingleOrDefault(c => c.Number.Equals(number)); 
    } 

    public Candidate GetMember(string number) 
    { 

     return new Candidate(); //This one needs to return from the Function Import 
    } 
} 

큰 호응을 얻었습니다.

답변

1

직접 문제를 해결하려면 entitiesObjectSet<T>으로 전송하고 entites.Context 속성을 사용하여 ObjectContext을 얻을 수 있습니다. 이 코드를 볼 수 있듯이

public Candidate GetMember(string number) 
{ 
    var objectSet = Enities as ObjectSet<Candidate>; 

    if(objectSet == null) throw new Exception("Oh, it's not EF IObjectSet implementation");   

    return objectSet.Context.MyCustomFunction(string number); 
} 

은 전혀 좋지 않아 특정 IObjectSet 구현에 의존합니다.

더 나은 아이디어는 각 테이블 대신 집계 루트에 대한 리포지토리를 만드는 것입니다. 따라서 ObjectContext을 저장소 ctor에 전달하는 것이 더 자연스러운 것입니다.

+0

감사합니다. Yury. 당신은 충분히 "골재 뿌리"의 정의에 대해 자세히 설명해 주시겠습니까? 우리는 더 나은 확장 성을 위해 리팩터링 할 수없는 개발에 그다지 관심이 없습니다. –

+0

글쎄, "집계 루트"는 도메인 구동 디자인 (DDD) 개념입니다. 간단한 Order 1 .. * OrderLine 모델을 고려해보십시오. 일반적으로 주문없이 OrderLine을 만들지 않으므로 OrderRepository 만 필요합니다. 따라서 Order는 OrderLines에 대한 참조를 보유하는 집계 루트입니다. 집계 루틴을 정의하는 것은 응용 프로그램에서 '모델링'하려고하는 객체에 따라 달라지는 실용적인 DDD 질문입니다. –

0

나는이 경로를 따라 갔고 저장소에 ObjectContext의 인터페이스 구현을 전달할 때 고통이 적다는 것을 경험했다. 인터페이스 구현에는 함수를 호출하는 몇 가지 방법이 있어야합니다. 따라서 ObjectContext의 구체적인 구현을 전달할 때 모든 것이 잘 작동합니다.

관련 문제