Создание пустой коллекции SearchResultCollection - PullRequest
0 голосов
/ 18 января 2019

Мне нужен способ создания пустой коллекции SearchResultCollection, чтобы вызывающим пользователям гарантировался действительный набор SearchResultCollection независимо от любых исключений, обработанных в методе.

Я не собираюсь делать макеты, как здесь ответили: Moq C #, встроенный в класс

У меня есть класс, который выполняет различные поиски в AD, используя методы DirectorySearcher.FindOne или DirectorySearcher.FindAll.

DirectorySearcher searcher = new DirectorySearcher(searchroot, filter);

try{
    return searcher.FindAll();
} catch {
    return new SearchResultCollection(); //No constructor that I find.   
}

Исходя из проектного решения, я ожидаю, что каждый метод должен возвращать действительный (возможно, пустой) набор SearchResultCollection, даже если AD выдает исключение. Это значит, что вызывающие могут использовать цикл foreach для обработки и не заботиться о каких-либо объектах с нулевым возвратом из метода. Другими словами, возвращаемое значение должно быть либо верным набором возвращаемых записей, либо пустой коллекцией в том же формате.

Моя альтернатива - использовать Список, который работает, но добавляет сложности без особой ценности.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я также не смог найти конструктор для SearchResultCollection, однако, если поиск не удастся, вы можете попробовать по умолчанию в перехвате, который вернет коллекцию с 0 записями.

        DirectorySearcher searcher;
        SearchResultCollection ret;

        try
        {
            //Unknown search request
            searcher = new DirectorySearcher(searchroot, filter);
            ret = searcher.FindAll();
        }
        catch
        {
            //Default known that will return a collection with 0 entries
            searcher = new DirectorySearcher(null, "");
            ret = searcher.FindAll();
        }

        return ret;
0 голосов
/ 18 января 2019

Короткий ответ - нет, вы не можете.Вы можете каким-то образом захватить пустой SearchResultCollection, сохранить статическую ссылку на него и использовать его в качестве запасного значения в вашем API, но это совершенно странно, так как эта коллекция реализует IDisposable, и она должна быть удалена в конечном итоге.

Если вы не хотите возвращать пустой список, вы можете попробовать создать методы расширения, такие как EmptyIfNull()

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> me)
{
    return me ?? new List<T>();
}

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