2010-04-09 2 views
3

linq에서 sql을 사용하는 리포지토리 패턴을 사용하고 있습니다. 테이블 당 리포지토리 클래스를 사용하고 있습니다. 나는 내가Linq to SQL 리포지토리 패턴, 몇 가지 질문

ContactRepository, 좋은/표준 방법에서 일을하고, 알고 싶은

Contact GetByID() 
    Contact GetAll() 

COntactTagRepository

List<ContactTag> Get(long contactID) 
List<ContactTag> GetAll() 
List<ContactTagDetail> GetAllDetails() 

class ContactTagDetail 
{ 
    public Contact Contact {get;set;} 
    public ContactTag COntactTag {get;set;} 
} 

내가 contacttag

에 대한 같은 내가 contactrepository에서 메서드를 호출 접촉을 필요로 할 때

하지만 연락처와 태그가 필요할 경우 ContactTag 저장소에서 GetDetais()를 호출하여 COntactTag 엔터티를 반환하지 않습니다. orm에 의해 생성 된 그것의 반환 ContactTagDetail 엔티티 conatining 모두 ornt에 의해 생성 된 Contact 및 COntactTag, 나는 COntactTag 저장소에서 GetAll을 간단하게 호출 할 수 있고 Contact.ContactTag에 액세스 할 수 있지만 SQL에 linq로는 지연된로드에 대한 옵션이 없음을 알고 있습니다. 쿼리 수준에서 관련 엔터티가있는 엔티티가 필요할 때마다 프로젝션 클래스를 만듭니다.

또 다른 의심의 여지가 있습니다. 나는 두 메소드 모두에서이 메소드를 올바르게 수행해야합니다. & Contacttag repostitory in Contact repository GetALlWithTags) 또는 뭔가하지만 나는 COntactTag 저장소에서 그것을하고있다

당신의 제안은 무엇입니까?

답변

5

세부 사항을 설명 할 시간이 없지만 기본적으로 테이블과 리포지토리간에 일대일 관계가 없습니다. 나는 그 실수를 저질렀다. 대신 저장소에 개념적으로 관련된 모든 테이블을 포함하십시오. 귀하의 경우 Contacts 및 ContactTags (및 기타 관련 테이블)를 모두 처리하는 Contact 저장소가 있어야합니다. "관련"이 의미하는 것에 대한 규칙은 없으며 오직 사용자 만 결정할 수 있습니다. 그러나 응용 프로그램의 요소가 자연스럽게 함께 그룹화되는 방법에 대한 이해를 기반으로 의사 결정을 제어하십시오.

Multiple or Single Repositories with LINQHow to use the repository pattern correctly?

+0

나는 등의 방법을 삭제/삽입을 쓸 것이다 많은 관련 기관과 저장소가있을 때 그것의 좋은하지만, – MindlessProgrammer

+0

당신은 수에 별도의 서비스가 있어야합니다)입니다 그들이 "작업 단위"로 관련되어있는 한 모든 것을 하나의 저장소에 저장하십시오. –

-1

난 당신이 올바른 궤도에있어 믿습니다

또한 유사한 문제와 SO 그 거래에이 두 스레드의 읽기 있습니다. linq to sql과 함께 실행해야 할 한 가지 문제점은 테이블과의 일대일 매핑입니다. 그래서 당신은 많은 관계 표에 많은 것을 노출시켜야합니다.

나는이 문제를 해결하기 위해 SQL에 linq에 액세스 할 수 있지만 호출을 반환하기 전에 모든 것을 POCO 객체에 매핑하는 데이터 레이어를 사용합니다.

public IQueryable<ArtGalleryData.Image> GetImagesByImageGroup(int id) 
    { 

     return SqlDataContext.Image_ImageGroups 
      .Where(iig => iig.ImageGroupID == id) 
      .Join(
      SqlDataContext.Images, 
      iig => iig.ImageID, 
      i => i.ImageID, 
      (iig, i) => new ArtGalleryData.Image 
      { ImageID = i.ImageID, 
       Description = i.Description, 
       Title = i.Title, 
       Height = i.Height, 
       Width = i.Width }).AsQueryable(); 
    } 

기본적으로 나는 linq 객체 이미지를 POCO 객체 이미지로 매핑하고 있습니다. 는 (나는 혼란의 종류를 알고 있지만, 내가 손에 가지고있는 좋은 예.)

당신이 된 IQueryable <T> 객체를 반환 지연 로딩의 효과를 얻을 수 있습니다. 이렇게하면 필요할 때까지 쿼리 실행을 보류 할 수 있습니다.내가 알고있는 대부분의 롭 Connerys을 읽고 있었다

T > 된 IQueryable <를 통해 LazyList이 게으른 로딩 (지연된 실행)을 허용 컬렉션 : 그들에 의존 컬렉션 개체에 대한 또한

나는이 위대한 헬퍼 클래스를 발견 블로그 MVC Store Front.

블로그 게시물을 읽고 Store 프론트 프로젝트를 다운로드합니다. 많은 질문에 답할 것입니다. asp.net MVC를 사용하지 않는다면 데이터 액세스 레이어를 살펴 보는 것이 큰 도움이 될 것입니다.

희망 하시겠습니까?

+1

Rob Connery Roby Cory –

+0

감사합니다. 내 항목을 업데이트하겠습니다. – Anthony

+0

-1 해당 누출 'IQueryable '을 공개하지 마십시오. – jgauffin

1

이것은 저장소 패턴이 아닙니다. 저장소 패턴은 기본적으로 도메인의 특정 유형의 모든 개체 컬렉션으로 (개념적으로) 작용하여 지속성을 추상화하는 개체를 만듭니다.

따라서 연락처 저장소는 다음과 같이 작동 할 수 있습니다 :

IContacts contacts = GetContactRepository(); 
using(var uow = UnitOfWork.Create()) { 
    var contact1 = contacts.Get(new FindByNameSpecification("Fred")); 
    contact1.LastName = "Rubble"; 
    var contact2 = new Contact("Barney", "Flistone"); 
    contacts.Add(contact2); 
    // both contact1 and contact 2 are implicitly saved at the end of the unit of work 
} 

작동합니다 저장소 이런 식으로 뭔가 할 수있는 방법에 약간 느슨한 정의 : 당신이있어 무엇

IContactRepository contacts = GetContactRepository(); 
using(var uow = UnitOfWork.Create()) { 
    var contact1 = contacts.GetByName("Fred"); 
    contact1.LastName = "Rubble"; 
    contacts.Save(contact1); 
    var contact2 = new Contact("Barney", "Flistone"); 
    contacts.Save(contact2); 
} //The save is explicit but the commit is implicit 

입니다 a table data gateway.

문제는 각 테이블마다 하나의 게이트웨이를 생성한다는 것입니다. 나는 그것을 반대하는 것이 좋습니다.

연락처 도메인에 태그가 지정되어 있습니까? 그렇다면 속성이 있어야합니다.

public class Contact { 
    public IEnumerable<Tag> Tags { get; } 
    public void TagWith(Tag tag) { .... } 
    public void UnTag(Tag tag) { ... } 
} 

또한 연락처 아래에 접촉이없는 태그를 추가 할 의향이 있습니까? 더 후 더욱 쉽게 얻을 경우 - 당신이 전혀 태그를 관리 할 수있는 게이트웨이를 필요 없어, 단지 태그가 같이 (도메인의 일부가 아닌 경우 연락처 개체가, 그런데 그것을

public interface IContactRepository { 
    IEnumerable<Contact> GetAll(); // returns Contacts along with their tags 
    void Save(Contact); // saves Contact along with any tags 
} 

을 처리하자 응용 프로그램 문제는 당신이 아마 별도의 프로젝트

public interface IAssociateTags { 
    IEnumerable<Tag> GetTagFor(Contact contact); 
    void TagContact(Contact contact, Tag tag); 
    void UnTagContact(Contact contact, Tag tag); 
}