Универсальный интерфейс VS универсальный метод? - PullRequest
0 голосов
/ 12 июля 2010

Я пишу универсальный тип для обработки базовых объектов 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.

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

Заранее спасибо!=) * * Тысяча двадцать-семь

1 Ответ

1 голос
/ 13 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...