Я пишу универсальный тип для обработки базовых объектов Active Directory, таких как группы, организационные единицы и пользователи.
Я также использую «ручное» внедрение зависимостей в моем универсальном интерфейсе.Я хотел бы знать, если в моей ситуации, что является более подходящим: универсальный интерфейс или универсальный метод?
Вот упрощенный пример кода, чтобы показать вам:
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);
Так что я мог бы получить список групп:
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.
Я знаю, что это, возможно, недостаточно ясно.Не стесняйтесь задавать мне свои вопросы, чтобы я мог помочь вам помочь.
Заранее спасибо!=) * * Тысяча двадцать-семь