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(); 
    } 
} 

Итак, вот моя точка зрения. Я хотел бы сделать мой интерфейс IDirectorySource неосновным, поскольку я буду продвигать свой класс DirectorySource<T> до public. Поэтому мне нужно было только объявить источник так:

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

Так что я бы смог retrive список групп:

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

Но мне интересно, должен ли я позволить мой интерфейс IDirectorySource<T> родовое, или сделать его не общим и сделать мой метод IDirectorySource.ToList(), поэтому мне не нужно было бы вводить мой интерфейс, а только тот класс, который предоставил бы мне экземпляр моего интерфейса.

было бы лучше, чтобы написать свой интерфейс так:

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

Я знаю, что это, возможно, не достаточно ясно. Не стесняйтесь задавать мне свои вопросы, чтобы я мог помочь вам помочь мне.

Заранее благодарен! =)

+0

Можете ли вы использовать пространство имен AccountManagement в .NET 3.5? Это, вероятно, сделает код, который вы пытаетесь написать ненужным. – tvanfosson

+0

Ваш «упрощенный образец кода» может немного упростить. Попытайтесь уменьшить код, чтобы он иллюстрировал только шаблон, который вы хотите обсудить. У вас есть много посторонних деталей в вашем примере (например, FindProperties() и т. Д.). – Karmastan

+0

К сожалению, мне не разрешено использовать .NET 3.5, несмотря на то, что мне это очень понравилось, так как я мог использовать библиотеку LINQ-to-AD от Bart de Smet. =) Спасибо за предложение! –

ответ

1

Для же экземпляра из IDirectorySource, вы когда-нибудь понадобится, чтобы вызвать метод (например, ToList) с использованием различных типов?

Если нет, то оставляя IDirectorySource родовой и методы (ToList) необщей бы для чистого кода, позволяя объекты наследника IDirectorySource реализовать свою собственный тип-знает логику.

+0

@Ed Noepel: Спасибо! Это то, что я думал, но несколько раз, однажды в кастрюле, мы даже не можем видеть перед нами. Это помогает. знак равно –

Смежные вопросы