سؤال

ما هو البديل أنماط استخدام الكيان الإطار ؟

بعض أعلم هي:

  1. "عادي" EntityFramework - ويعرف أيضا باسم وحدة العمل

    using (Data.Model c = new Data.Model())
    {
        var z = c.Users.Where(x=>x.Name=='John');
    }

  2. نمط مستودع

    //Model implements IRepository
    User user = Model.Instance.Get<User>(u => u.Name == "John");
    

  3. ما آخر ؟
  4. ?
هل كانت مفيدة؟

المحلول

كتاب جيد أن ننظر إلى مارتن فاولر "أنماط من تطبيق المشاريع المعمارية".

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

نصائح أخرى

أنا أجيب على سؤالك على أساس افتراض أن كنت تستخدم إطار الكيان مباشرة في واجهة المستخدم الخاصة بك/تحكم/الخدمات.

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

النهج الثاني أي "نموذج تنفذ مستودع" هو أيضا خطأ في رأيي ، بيكوس نموذج Respositories مختلف المسؤوليات على أساس "واحد مسؤوليتها" جزء من صلب المبادئ يجب أن لا دمج المفهومين معا.حتى إذا كنت ترغب في استخدام الكائنات النشطة نمط في النموذج الخاص بك الذي لا يوصي ، يجب فصل النموذج الخاص بك من ORM تستخدمها.

أفضل و الأكثر الموصى بها الحل هو أن يكون واجهة مثل IRepository أو IRepository مع الأعضاء الأساسية مثل نمط يوحي.شيء من هذا القبيل:

Interface IRepository<T> where T:class
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);

    // if you don't want to return IQueryable
    T FindById(object id);
    IEnumerable FindXXXXX(params)

    // if you prefer to return an IQueryable
    IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}

علما بأن بعض أهل أصدق مستودعات يجب أن لا عودة IQueryable.بالإضافة إلى ذلك, يمكنك أن تنظر في استخدام ISpecification بدلا من تعابير امدا.

سوف تحتاج إلى تنفيذ IRepositoy واجهة معظم الكيانات.باستخدام هذا النهج يمكنك أيضا يسخرون من المستودعات الخاصة بك عند كتابة وحدة الاختبارات.في الإنتاج, سوف تحتاج إلى استخدام الأولمبية الدولية مزود مثل الوحدة ، Ninject, Linfu, Catsle وغيرها.يمكنك أيضا الاستفادة من مايكروسوفت المشتركة خدمة محدد تنفيذ لتجنب الإزدواج إلى المواصفات الأولمبية الدولية الإطار.

في الأيام القديمة كان لدي الوصول إلى البيانات واجهة التي كان impleneted محدد مجال الأعمال التجارية أو الخدمة.واحدة من القضايا مع هذا النهج هو أن كنت في نهاية المطاف مع تكرار الرمز في مختلف البيانات الوصول إلى الخدمات إذا كنت تتبع التعليمات البرمجية المصدر الخاصة بك وسوف في نهاية المطاف.

نحن نستخدم التعليمات البرمجية مشابهة لما في الوحدة من العمل على سبيل المثال.

ما نقوم به بالإضافة إلى خريطة الكائنات نقل البيانات الكائنات.

هناك العديد من المقالات حول هذا الموضوع ، ولكن سيتم تخفيض القائمة إلى حد كبير إذا كنت مثل فكرة جيدة. هذا المقال من مجلة MSDN هو جيد جدا, على الرغم من أنها تتعامل تحديدا مع n-tier التطبيقات.ولكن منذ كنت لا أقول ما كنت بناء, ربما أنها سوف تساعد.

LINQ 2 SQL يمكن أن تكون بديلا.هنا هو المادة حقن التبعية مع الوحدة Linq to SQL DataContexts

الوحدة - http://unity.codeplex.com/

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