هل هو عمل مزدوج إنشاء مكون الوصول إلى البيانات ومكون الأعمال؟

StackOverflow https://stackoverflow.com/questions/3632736

سؤال

أقوم بتصميم طلبي الأول الذي يتكون من بيانات وأعمال وطبقة عرض تقديمي.

مكونات عملي (على سبيل المثال ، business.components.usercomponent) لديها حاليًا الطريقة التالية:

public void Create(User entity)
{
    using (DataContext ctx = new DataContext())
    {
        ctx.Users.AddObject(entity);
        ctx.SaveChanges();
    }
}

أنا أحب هذا التصميم. ومع ذلك ، واجهت بعض الأمثلة عبر الإنترنت من شأنها أن توصي بالتنفيذ التالي:

public void Create(User entity)
{
    // Instanciate the User Data Access Component
    UserDAC dac = new UserDAC();
    dac.InsertUser(entity);
}

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

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

ما الذي يمكن اعتباره أفضل الممارسات لتنفيذ وظائف CRUD الأساسية بشكل صحيح في تطبيق الطبقات؟ هل يجب "ترميزها" في مكون الأعمال أو في مكون الوصول إلى البيانات؟

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

المحلول

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

السبب الذي يجعل الناس يحبون استخدام النهج الثاني هو اختبار الجهل والإصرار. إذا كنت تستخدم First First Complete ، فإن مكون عملك يقترن بإحكام بإطار الكيان. السخرية ObjectContext ليست مهمة سهلة للغاية ، لذا فإن الاختبار صعب. إذا كنت تستخدم النهج الثاني ، فإن طبقة عملك مستقلة على طبقة الاستمرار. يمكنك بسهولة اختباره ويمكنك حتى تغيير طبقة الثبات إذا كنت بحاجة إلى ذلك. لكن هذه مفاهيم أكثر تقدماً ربما لا تبحث عنها في الوقت الحالي. سوف يحتاج الرمز الخاص بك إلى بعض التحسينات الإضافية ليكون قابلاً للاختبار.

يمكن تنفيذ DAC أيضًا كمستودع. هناك الكثير من الطرق كيفية إنشاء مستودع عام بحيث يكون لديك فئة واحدة فقط وتحدد نوع الكيان عند استئصال المستودع:

var repository = new GenericRepository<User>();

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

هناك الكثير من المقالات حول تنفيذ المستودع ووحدة العمل على الإنترنت. لدي بعضهم مخزّن كمفضل في المنزل ، لذا إذا كنت مهتمًا ، فيمكنني إدراجها في إجابتي لاحقًا.

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