Я пишу общий тип для обработки основных объектов 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.
Я знаю, что это, возможно, не достаточно ясно. Не стесняйтесь задавать мне свои вопросы, чтобы я мог помочь вам помочь мне.
Заранее благодарен! =)
Можете ли вы использовать пространство имен AccountManagement в .NET 3.5? Это, вероятно, сделает код, который вы пытаетесь написать ненужным. – tvanfosson
Ваш «упрощенный образец кода» может немного упростить. Попытайтесь уменьшить код, чтобы он иллюстрировал только шаблон, который вы хотите обсудить. У вас есть много посторонних деталей в вашем примере (например, FindProperties() и т. Д.). – Karmastan
К сожалению, мне не разрешено использовать .NET 3.5, несмотря на то, что мне это очень понравилось, так как я мог использовать библиотеку LINQ-to-AD от Bart de Smet. =) Спасибо за предложение! –