سؤال

أنا أعمل مع Active Directory باستخدام C #. Instantiating PrincipalContext يبدو أن الكائن باهظ الثمن، لذلك أود تخزين واحد في متغير الطبقة.

عند استخدام PrincipalContext كمتغير محلي، يمكنني استخدام المريحة using بناء الجملة. عند تخزين A. IDisposable كائن في متغير ثابت، كيف يمكنني التخلص من الكائن بشكل صحيح؟

هل كانت مفيدة؟

المحلول

النمط العام لهذا هو تنفيذ IDisposable واجهة على صفك. خذ هذا المثال:

public class YourClass : IDisposable
{
    private OtherDisposableType yourResource;

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

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

هذا هو، في الحد الأدنى، ما تحتاج إلى القيام به.

تعديل

دعا إصداري السابق في أعقاب نمط النهادة في جميع الحالات، التي كانت (بشكل صحيح) موجهة إلى إرشادات تصميم الإطار. ومع ذلك، في حال كنت تتعامل بالفعل مع الموارد غير المدارة (على سبيل المثال، فأنت تقوم بإجراء مكالمات P / Invoke مباشرة والحصول على مؤشر يجب تحريرها بشكل صريح) من المستحسن أن تقوم بإنشاء نهائي واستدعاء 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 التعامل مع الكثير من هذا لك.

في الأساس تريد التخزين المؤقت لمورد باهظ الثمن. هذا شيء جيد.

البيانات العالمية (المتغيرات الثابتة في هذه الحالة) ليست شيء جيد، IMHO. بدلا من ذلك، لماذا لا تجعلها متغير مثيل والتحكم في العمر؟

اكتب صفك الذي يتعامل مع مسؤوليات الإعلانات، ولديه إنشاء واستخدام principalcontext، وجعلها ناهتة أيضا (باستخدام التخلص من نمط). استخراج واجهة منه لتلفه واتخذ الفصول التي تستخدمها أسهل في الاختبار.

سوف تأخذ الفصول التي تريد استخدام الخدمات الإعلانية معلمة منشئت لواجهةك الجديدة (حقن التبعية أو دي). يمكنك إما إنشاء فصلك يدويا في كتلة باستخدام وفصوله إلى الفئات أو استخدام إطار حاوية دي. وبعد يمكنك الحصول على إطار وضع إطار مستوى الإعلان إلى عمر الحاوية (والتي قد تكون مثالية أيضا). يرى كيف يمكنك التوفيق بين IOC IOC؟ وثائق الحاويات الخاصة بك لمزيد من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top