كيفية جعل كائن غير قابل للانتعراض متغير فئة؟
-
19-09-2019 - |
سؤال
أنا أعمل مع 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؟ وثائق الحاويات الخاصة بك لمزيد من ذلك.