1

ASP.NET MVC 응용 프로그램 (.NET 3.5, ASP.NET MVC 1.0 및 Entity Framework 사용)을 개발하면서 Repository Pattern을 이해하려고합니다. 의존성 주입과 하나의 Controller 및 하나의 Entity 유형을 모두 사용하기에 충분했지만 이제는 다른 유형 간의 관계에 대한 지원을 구현할 때까지 갇혀 있습니다.C#에서 인터페이스의 상속 된 메서드 이름 바꾸기

내가 본 모든 예에서 저장소 인터페이스는 IContactsRepository과 같으며 Contact 항목에만 관련된 (CRUD) 메서드가 포함되어 있습니다. Contacts의 그룹화를 구현하기 위해 Group이라는 엔티티 유형과 그룹에 대한 처리 (CRUD) 작업을위한 IGroupRepository 인터페이스가 있습니다.

    이 속하는 방법은 (예를 들어,이 경우의 GroupContact 추가 방법 AddToGroup) 하나 개 이상의 항목 유형에 관한 것이다 않는
  • ? 다음,

    ITypedRepository<T> 
    { 
        IEnumerable<T> GetAll(); 
        T Get(int id); 
        bool Add(T newObj); 
        bool Edit(T editedObj); 
        bool Delete(int id); 
    } 
    
    IContactsRepository : ITypedRepository<Contact> { } 
    
    IGroupsRepository : ITypedRepository<Group> { 
        bool AddToGroup(int contactId, int groupId); 
    } 
    
    IRepository : IContactsRepository, IGroupsRepository 
    

    난 후 IRepository 상속 마스터 저장소를 만들려고 :

난 I는 다음과 같은 인터페이스를 생성 리포지터리 큰 유전 구조물을 시도

public class EntitiesRepository : IRepository 
{ 
    IEnumerable<Contact> IRepository<Contact>.Get() 
    { 
     throw new NotImplementedException(); 
    } 
    IEnumerable<Group> IRepository<Group>.Get() 
    { 
     throw new NotImplementedException(); 
    } 
    // Etc. All methods were generated by hitting [Ctrl]+[.] with the cursor on 
    // the interface inheritance reference to IRepository and selecting 
    // "Explicitly implement IRepository" 
} 

이 코드로 내 컨트롤러에서 리포지토리의 메서드 중 하나를 호출하려고하면

(210)
var contacts = _repository.Get(); 

나는 IContactsRepositoryIGroupsRepository로 얻었 Get<Group>()를 통해 상속 Get<Contact>() 사이의 모호함에 대해 빌드 오류 메시지가 표시됩니다. 나는 이것이 허용되지 않는다는 것을 이해했다. IRepositoryinherits the same generic interface with different types (링크 된 기사의 예제 5 참조). 나는 다른 인터페이스를 통해 상속 이후

  • 지금, 나는 다음과 같은 예를 들어, 이러한 방법 "이름을 오버라이드 (override)"수있는 기회가있다?

    IContactsRepository : ITypedRepository<Contact> 
    { 
        IEnumerable<Contact> GetContacts = ITypedRepository<Contact>.Get(); 
        ... 
    } 
    

그런 식으로, 나는 어떤 모호함없이 IRepository.Getcontacts에서 액세스 할 수 있습니다. 가능합니까? 아니면이 문제에 대한 해결 방법이 있습니까? 설명에 대한

그리고 새로운 질문 :

  • 컨트롤러 내가 원하는 Get() 방법의 어떤에서 통화에서 지정한 어쨌든이 있나요?

  • 처음 문제를 해결하는 가장 좋은 방법은 무엇입니까? 하나의 엔티티 유형 대신 많은 것을 처리하는 저장소가 필요합니까?

편집 : Controller에서 추가 코드 Repository 클래스의 예와를 호출합니다.

+0

명시 적 인터페이스 구현을 고려하십시오. 자세한 내용은 http://stackoverflow.com/questions/1077816/access-modifiers-on-properties-in-c –

+0

답장을 보내 주셔서 감사합니다. 해명을위한 노력을 기울였습니다. –

+1

이 질문에 대한 답변을 매번 한 번씩 올리겠습니다. –

답변

0

내가 당신을 생각 :

IGroupRepository : ITypedRepository<Group> 
{ 
    bool AddContactToGroup(Group g, Contact C); 
} 
0

당신은 아마 CRUD 방법뿐만 아니라 당신의 IGroupRepository에 방법을 전문 것이다 :

public class EntitiesRepository : IRepository 
{ 
    IEnumerable<Contact> IRepository<Contact>.Get() 
    { 
     // Return something 
    } 
    IEnumerable<Group> IRepository<Group>.Get() 
    { 
     // Return something 
    } 

    public IEnumerable<Contact> GetContacts() 
    { 
     return (this as IRepository<Contact>).Get(); 
    } 

    public IEnumerable<Group> GetGroups() 
    { 
     return (this as IRepository<Group>).Get(); 
    } 
} 
+0

감사! 나는 이미 그것을 가지고 있지만, 이것을 시도 할 때 나를 위해 일하지 않는 것은 상속 사슬이다. –

0

가 명시 적 구현을 ​​호출 비 모호한 이름과 방법을 추가 이 모든 복잡성이 필요하지 않습니다. 연락처를 그룹에 추가하면 그룹이 변경됩니다. Group 클래스에 연락처 모음이 있다고 가정합니다. 연락처를 그룹에 추가 한 후에는 그룹을 저장해야합니다. 따라서 AddContactToGroup 메서드가 실제로 필요합니다. Group 저장소 인터페이스의 Save 메서드는 동일한 작업을 수행합니다. 또한 Group의 모든 새로운 관계형 속성에 대해 새로운 메소드가 필요하지 않습니다.

Save 메서드 자체를 구현하려면 NHibernate를 사용하는 경우 관련 메서드를 호출하면됩니다.

+0

그것은 참으로 아주 좋습니다! 그러나 실제로 문제를 해결하지는 못합니다.이 방법을 사용하면 IRepository 인터페이스에 아무 것도 지정하지 않아도됩니다 (단 하나의 명명 된 메서드를 모두 정의하지 않는 한이 메서드는 존재하지 않지만 그 메서드를 피하고 싶습니다. 처음...). 즉, 인터페이스를 통해 컨트롤러를 저장소에서 분리 할 수 ​​없기 때문에 쉬운 방법으로 컨트롤러를 테스트 할 수 없습니다. –

+1

왜 존재하는지 확인해야합니까? 명시 적으로 호출하려는 경우에만 존재해야합니다. 어쨌든 Get 메서드는 IRepository 의 명시 적 구현으로 항상 존재합니다. 컨트롤러에서는 IRepository가 아닌 IContactsRepository 또는 IGroupRepository로 저장소를 선언하므로 모호하지 않게됩니다. –