Question

Je travaille avec Active Directory en utilisant C #. Instanciation du PrincipalContext L'objet semble coûteux, donc j'aimerais en stocker un dans une variable de classe.

Lors de l'utilisation PrincipalContext En tant que variable locale, je peux utiliser le pratique using syntaxe. Lors du stockage d'un IDisposable Objet dans une variable statique, comment puis-je m'assurer que l'objet est correctement éliminé?

Était-ce utile?

La solution

Le modèle général pour cela est de mettre en œuvre le IDisposable interface sur votre classe. Prenez cet exemple:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

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

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

C'est, au minimum, ce que vous devez faire.

ÉDITER

Ma version précédente a plaidé en suivant le modèle Finalizer dans tous les cas, ce qui a été (correctement) souligné être contre les directives de conception du framework. Cependant, dans le cas où vous avez réellement affaire à des ressources non gérées (par exemple, vous passez des appels directs P / Invoquez et obtenez une poignée qui doit être explicitement libérée), il est conseillé de créer un finaliseur et d'appeler Dispose à l'intérieur pour protéger contre les personnes qui consomment votre code et n'appellent pas Dispose:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

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

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

        GC.SuppressFinalize(this);
    }

    ~YourClass()
    {
        Dispose();
    }
}

Autres conseils

Regardez ce que le System.ComponentModel L'espace de noms fait. Fondamentalement, le modèle que j'utilise généralement est d'avoir une collection de sous-composants, qui inclut tout ce que je possède qui n'est pas une «valeur» - qu'il s'agisse ou non ou non IDisposable.

Alors, quand je Dispose() moi-même, je mette sur cette collection et Dispose Tout ce qui implémente IDisposable.

Un avantage de cette technique est que si un objet que je possède commence à ne pas être jetable, mais ajoute plus tard le IDisposable Interface, ma classe fera la bonne chose sans jamais avoir à changer.

De plus, l'utilisation d'un conteneur DI / IOC peut gérer une grande partie de cela pour vous.

Donc, fondamentalement, vous souhaitez mettre en cache une ressource coûteuse. C'est une bonne chose.

Les données globales (variables statiques dans ce cas) ne sont pas une si bonne chose, à mon humble avis. Au lieu de cela, pourquoi ne pas en faire une variable d'instance et contrôler la durée de vie?

Écrivez votre classe qui s'occupe des responsabilités publicitaires, faites-la créer et utiliser le PrincipalContex Disposer du modèle). Extraire une interface de celui-ci pour le découpler et rendre les classes qui l'utilisent plus facilement à tester.

Les classes qui souhaitent utiliser les services publicitaires prendront un paramètre de constructeur de votre nouvelle interface (Injection de dépendance ou di). Vous pouvez soit créer votre classe manuellement dans un bloc d'utilisation et le transmettre aux classes ou utiliser un Cadre de conteneur DI. Vous pouvez demander au cadre de définir la durée de vie de l'objet AD à la durée de vie du conteneur (qui peut également être iDisposable). Voir Comment réconcilier iDisposable et IOC? et votre documentation de conteneur Di pour en savoir plus à ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top