Вопрос

Я работаю с Active Directory, используя C#. Создание PrincipalContext Объект кажется дорогим, поэтому я хотел бы хранить его в переменной класса.

Когда используешь PrincipalContext Как локальная переменная, я могу использовать удобный using синтаксис. При хранении IDisposable Объект в статической переменной, как я могу убедиться, что объект правильно утилизируется?

Это было полезно?

Решение

Общий шаблон для этого - реализовать IDisposable интерфейс в вашем классе. Возьмите этот пример:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

    public YourClass()
    {
        yourResource = new OtherDisposableType();
    }

    public void Dispose()
    {
        yourResource.Dispose();
    }
}

Это как минимум, что вам нужно сделать.

РЕДАКТИРОВАТЬ

Моя предыдущая версия выступала за шаблон финализатора во всех случаях, что было (правильно), что было против руководящих принципов проектирования фреймворта. Однако, если вы на самом деле имеете дело с неуправляемыми ресурсами (например, вы делаете прямые вызовы P/вызываете и получаете направление, которая необходимо явно освобождена), желательно, чтобы вы создали финализатор и звонили Dispose внутри защиты от людей, которые потребляют ваш код и не звонят Dispose:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

    public YourClass()
    {
        yourResource = new OtherDisposableType();
    }

    public void Dispose()
    {
        yourResource.Dispose();

        GC.SuppressFinalize(this);
    }

    ~YourClass()
    {
        Dispose();
    }
}

Другие советы

Посмотрите, что за System.ComponentModel Пространство имен делает. По сути, шаблон, который я обычно использую, состоит в том, чтобы иметь набор подкомпонентов, который включает в себя все, что я владею, не является «ценностью» - независимо от того, реализуется он или нет. IDisposable.

Затем, когда я Dispose() Я сам перевернул эту коллекцию и Dispose все, что реализует IDisposable.

Одним из преимуществ этой техники является то, что если объект, которым я владею, начинается не одноразовый, но позже добавляет IDisposable Интерфейс, мой класс поступит правильно, не изменяясь.

Кроме того, использование контейнера DI/IOC может справиться с этим для вас.

Так что в основном вы хотите кэшировать дорогой ресурс. Это хорошая вещь.

Глобальные данные (статические переменные в этом случае) не так хороша, ИМХО. Вместо этого, почему бы не сделать это переменной экземпляра и контролировать время жизни?

Напишите свой класс, который выполняет обязанности AD, создает и использует PrincipLockEntext, а также делает его идентифицируемым (используя Утилизировать рисунок) Извлеките из него интерфейс, чтобы отделить его и облегчить его тестирование классов.

Классы, которые хотят использовать рекламные услуги, примут параметр конструктора вашего нового интерфейса (Внедрение зависимости или di). Вы можете либо создать свой класс вручную в блоке, и передать его в класс, либо использовать DI Container Framework. Анкет Вы можете получить структуру установить время жизни объекта AD в срок службы контейнера (что также может быть идентифицируемо). Видеть Как вы согласовываете Idisposable и IOC? и ваша документация по контейнеру DI для получения дополнительной информации об этом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top