سؤال

لقد قمت بتنفيذ نمط المستودع مع الجهل المستمر.يتفاعل تنفيذ المستودع فقط مع كائنات الكيان الخاص بي، IUnitOfWork و ITable<T> واجهات.القصد هو أن IUnitOfWork لا يتم إعادة استخدامها ولكنها تمثل معاملة واحدة.لقد قمت حتى الآن بتنفيذ إصدارات في الذاكرة بالإضافة إلى إصدارات Linq-to-Sql من IUnitOfWork و ITable<T>.

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

FooUnitOfWork unitOfWork = new FooUnitOfWork();
Repository repos = new Repository(unitOfWork);
// ...act upon repos
unitOfWork.Save();

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

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

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

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

المحلول

تحديث: في حين أن هذا لم ينهار حقًا، فقد انتهى به الأمر إلى إنتاج حاوية IoC للرجل الفقير.انتهى بي الأمر باستبدال كل هذه:

UnitOfWorkFactory.Create();

مع المعمم محدد الخدمة المشتركة تطبيق:

Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IUnitOfWork>();

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


ربما يجب علي استخدام مصنع بسيط للغاية حيث يمكنني تعيين رد اتصال؟يمكن أن تحتوي على مجموعة من الأساليب الثابتة مثل هذا:

public static class UnitOfWorkFactory
{
    private static Func<IUnitOfWork> FactoryMethod;

    public static IUnitOfWork Create()
    {
        if (UnitOfWorkFactory.FactoryMethod == null)
        {
            throw new InvalidOperationException("...");
        }

        return UnitOfWorkFactory.FactoryMethod();
    }

    public static void SetFactoryMethod(Func<IUnitOfWork> factory)
    {
        UnitOfWorkFactory.FactoryMethod = factory;
    }
}

أين ينهار هذا؟

نصائح أخرى

أود أن أقترح استخدام نمط Vistor لاكتشاف تطبيقات واجهة IUnitOfWork.

[UnitOfWork(Name="foo")]
public class FooUnitOfWork : IUnitOfWork {}

Repository repo = new Repository("foo");
//stuff happens
repo.Save(); //or repo.Worker.Save();

داخل مثيل الريبو، يعثر مصنع الاكتشاف على العامل ويقوم بإنشائه.

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