0

그룹, 조직 구성 단위 및 사용자와 같은 기본 Active Directory 개체를 처리하기 위해 제네릭 형식을 작성하고 있습니다.일반 인터페이스 VS 일반 메서드?

제 일반적인 인터페이스에 "수동"의존성 삽입도 사용하고 있습니다. 제 상황에서 더 적절한 지 알고 싶습니다 : 제네릭 인터페이스 또는 일반적인 방법?

는 다음을 보여 간단한 코드 예제입니다 :

public interface IDirectorySource<T> where T : IDirectoryEntry { 
    IDirectorySearcher<T> Searcher { get; } 

    CustomSet<T> ToList(); // Related to my question, as I will here only return Searcher.ToList(); 
} 

public interface IDirectorySearcher<T> where T : IDirectoryEntry { 
    DirectorySearcher NativeSearcher { get; } 

    CustomSet<T> ToList(); // Related to my question... 
} 

public sealed class GroupSearcher : IDirectorySearcher<Group> { 
    public GroupSearcher(DirectoryEntry root, SearchScope scope) { 
     // Instantiating... 
    } 

    public DirectorySearcher NativeSearcher { get; private set; } 

    public CustomSet<T> ToList() { // That is the point of my question. 
     // Listing all T objects found in AD... 
    } 
} 

public sealed class DirectorySource<T> : IDirectorySource<T> where T : IDirectoryEntry { 

    public DirectorySource(IDirectorySearcher<T> searcher) { 
     Searcher = searcher; 
    } 

    public IDirectorySearcher<T> Searcher { get; private set; } 

    public CustomSet<T> ToList() { // Here's the point to my question. 
     return Searcher.ToList(); 
    } 
} 

그래서, 여기 내 지점입니다. 내 인터페이스를 비 제너릭으로 만들고 싶습니다. 내 DirectorySource<T> 클래스를 공개으로 승격시켜 드리겠습니다. 그래서 나는 단지과 같이 소스를 선언해야합니다 :

GroupSearcher groupSearcher = new GroupSearcher(root, scope); 
IDirectorySource groups = new DirectorySource<Group>(groupSearcher); 

그래서 내가 할 수있는 그룹의 목록을 가져 오지하는 것 : 내 IDirectorySource<T> 인터페이스는 일반적인하자 여부를

groups.ToList(); // Getting all the existing groups in AD here... 

을하지만 난 궁금해, 또는 비 제너릭으로 만들고 대신 IDirectorySource.ToList() 메서드를 일반으로 만들어야하므로 내 인터페이스를 입력 할 필요가 없으므로 내 인터페이스의 인스턴스를 제공하는 클래스 만 입력하면됩니다.

그렇게처럼 내 인터페이스를 작성하는 더 좋을 거라 :

public interface IDirectorySource { 
    CustomSet<T> ToList<T>(); 
} // With all the appropriate changes, indeed. 

나는 이것이 아마 충분히 명확 아니라는 것을 알고 있습니다. 당신이 나를 도울 수 있도록 당신의 질문을 물어보십시오.

미리 감사드립니다. =) IDirectorySource같은 인스턴스 를 들어

+0

.NET 3.5에서 AccountManagement 네임 스페이스를 사용할 수 있습니까? 아마도 코드를 쓸 필요가 없습니다. – tvanfosson

+0

"단순화 된 코드 샘플"은 좀 더 단순화를 사용할 수 있습니다. 토론 할 패턴 만 보여주기 위해 코드를 축소 해보십시오. 샘플에 많은 불필요한 세부 정보가 있습니다 (예 : FindProperties() 등). – Karmastan

+0

불행히도 Bart de Smet의 LINQ-to-AD 라이브러리를 사용할 수 있었기 때문에 .NET 3.5를 사용할 수 없었습니다. =) 그래도 제안 주셔서 감사합니다! –

답변

1

, 혹시 방법 (예 : ToList) 다른 유형을 사용하여 호출해야하는데? 다음 일반 자신의 형태를 인식하는 로직을 구현하는 IDirectorySource에서 서브 클래스 객체를 허용, 청소기 코드를 만들 것 제네릭이 아닌 방법 (ToList) IDirectorySource를 떠나

그렇지 않은 경우.

+0

@Ed Noepel : 감사합니다! 그것은 또한 내가 생각한 것입니다. 그러나 때때로, 냄비에 한번, 우리는 심지어 우리 앞에서 볼 수 없습니다. 이것은 도움이됩니다. =) –