سؤال

لذلك أنا أعمل على حاوية DI/IOC OpenNetcf.ioc ولدي طلب ميزة (معقول) لإضافة شكل من أشكال إدارة دورة الحياة للعناصر القابلة للتطبيق في مجموعات الحاويات.

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

في الوقت الحالي ، يمكن إضافة الكائنات باستخدام AddNew (من أجل البساطة ، سنفترض أن هناك تحميلًا زائد واحد فقط ولا يوجد إضافة):

public TTypeToBuild AddNew<TTypeToBuild>() { ... }

ما أفكر فيه هو إضافة طريقة جديدة (مجموعة جيدة منها ، لكنك تحصل على الصورة):

public DisposableWrappedObject<IDisposable> AddNewDisposable<TTypeToBuild>()
    where TTypeToBuild : class, IDisposable
{
    ...
}

حيث يشبه هذا القابل للتخلص من compledObject مثل هذا:

public class DisposableWrappedObject<T>
    where T : class, IDisposable
{
    public bool Disposed { get; private set; }
    public T Instance { get; private set; }

    internal event EventHandler<GenericEventArgs<IDisposable>> Disposing;

    internal DisposableWrappedObject(T disposableObject)
    {
        if (disposableObject == null) throw new ArgumentNullException();

        Instance = disposableObject;
    }

    ~DisposableWrappedObject()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        lock(this)
        {
            if(Disposed) return;

            EventHandler<GenericEventArgs<IDisposable>> handler = Disposing;
            if(handler != null)
            {
                Disposing(this, new GenericEventArgs<IDisposable>(Instance));
            }

            Instance.Dispose();

            Disposed = true;
        }
    }
}

الآن ، عندما يتم إضافة عناصر إلى الحاوية عبر AddNewDisposable ، تتم إضافة eventHandler أيضًا بحيث عند التخلص منها (عبر الغلاف) ، يزيله الإطار من المجموعة الأساسية.

لقد قمت بالفعل بتنفيذ هذا الأمر ويجري اختبارات الوحدة ، لكنني أبحث عن آراء حول المكان الذي قد يتم فيه كسر هذا ، أو كيف يمكن جعلها أكثر "ودية" للمطور المستهلك.

تحرير 1

نظرًا لوجود سؤال حول كيفية استخدام حدث التخلص ، إليك بعض التعليمات البرمجية (تم قطعها إلى ما هو مهم):

private object AddNew(Type typeToBuild, string id, bool wrapDisposables)
{
    ....

    object instance = ObjectFactory.CreateObject(typeToBuild, m_root);

    if ((wrapDisposables) && (instance is IDisposable))
    {
        DisposableWrappedObject<IDisposable> dispInstance = new
               DisposableWrappedObject<IDisposable>(instance as IDisposable);
        dispInstance.Disposing += new 
               EventHandler<GenericEventArgs<IDisposable>>(DisposableItemHandler);
        Add(dispInstance as TItem, id, expectNullId);
        instance = dispInstance;
    }

    ....

    return instance;
}

private void DisposableItemHandler(object sender, GenericEventArgs<IDisposable> e)
{
    var key = m_items.FirstOrDefault(i => i.Value == sender).Key;
    if(key == null) return;
    m_items.Remove(key);
}
هل كانت مفيدة؟

المحلول

ربما أفتقد شيئًا ، لكن لماذا تضيف طرقًا جديدة إلى واجهة برمجة التطبيقات؟ عند إضافة كائن إلى الحاوية ، يمكنك أن تتحقق مما إذا كان قابلاً للتطبيق والتعامل معه بشكل مناسب إذا كان الأمر كذلك.

أنا أتساءل أيضًا عما إذا كنت بحاجة إلى المدمر. على افتراض أن الحاوية قابلة للتطبيق (مثل الوحدة) ، يمكنك فقط تنفيذ نمط التخلص الأساسي وحفظ الكثير من GC النفقات العامة.

بعض الأسئلة التي قد تكون قابلة للتطبيق:

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