سؤال

أنا أعمل على تطبيق صغير من نقطة الصفر وأستخدمه لمحاولة تعليم نفسي مفاهيم الهندسة المعمارية وتصميم. إنه تطبيق .NET 3.5 ، WPF ، وأنا أستخدم SQL Compact Edition كمتجر بيانات الخاص بي.

أنا أعمل على طبقة منطق العمل ، وقد بدأت الآن في كتابة DAL. أنا فقط أستخدم SQLCeComamnds لإرسال استفسارات بسيطة و SQLcerEsultset للحصول على النتائج. بدأت في تصميم أساليب الإدراج والتحديث ، وإليك المشكلة - لا أعرف أفضل طريقة للحصول على البيانات اللازمة من BLL في DAL. هل أمر في مجموعة عامة؟ هل لدي قائمة معلمات ضخمة مع جميع البيانات الخاصة بقاعدة البيانات؟ هل أقوم ببساطة بالمرور في كائن العمل الفعلي (وبالتالي ربط dal بأشياء conrete في BLL؟).

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

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

المحلول

إذا كنت في وضعك ، فمن المحتمل أن أستخدم LINQ إلى SQL لتحديد طبقة الوصول إلى البيانات الخاصة بي - فسوف يوفر لك الكثير من العمل للحفاظ على كل الأشياء التي تمنحها SQLCEFOOBAR وأعطيك مصممًا (من نوع ما) للحفاظ على قاعدة البيانات الخاصة بك سوف تفتقر خلاف ذلك ، باستخدام SQL CE.

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

ربما لن أترك الكيانات تصل إلى التسلسل الهرمي مثل واجهة المستخدم. على هذا المستوى ، من المنطقي استخدام نموذج خصيصًا للعرض - خاصةً بالنظر إلى أنك تستخدم WPF.

بالطبع ، كل هذا يعتمد على حجم وتعقيد التطبيق الخاص بك. أفترض أنه تطبيق صغير إلى حد ما (مستخدم واحد؟) بالنظر إلى أنك تستخدم SQL CE.

نصائح أخرى

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

  • MS .NET: تطبيقات الهندسة المعمارية للمؤسسة (Esposito ، Saltarello)
  • MS دليل بنية التطبيق ، الطبعة الثانية.

الكتاب الثاني متاح على الإنترنت. نظرة هنا.

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

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

حول ربط dal الخاص بك بالأشياء في BLL ، أعتقد أنك يجب أن تقلق بشأن العكس ، وربط bll الخاص بك إلى dal الخاص بك. أود أن أستخدم واجهة لتمثيل DAL (كما هو الحال في iRepository) بهذه الطريقة ، يمكنك جعل BLL استدعاء أي نوع من آلية الثبات فقط عن طريق تغيير نوع iRepository الذي يستخدمه (نقاط إضافية إذا كنت تستخدم IOC: P). سيتم ربط الطبقات الملموسة التي تنفذ iRepository بأشياء العمل ، لكن عليهم أن يعرفوا ما الذي يوفرونه أليس كذلك؟ في حين أن BLL لا يتعين على معرفة ما الذي يقوم بالادخار.

لتمرير كائن العمل في DAL هو طريقة أبسط وأسرع. إنه يعمل في مشاريع صغيرة ، ولكن له نفس العيوب:

1) تعتبر كائنات العمل جزءًا من طبقة BLL ، وإذا قمت بتمرير كائنات في BLL ، فسيصبح DAL تعتمد على BLL. تعرف الطبقة المنخفضة عن العليا - وهذا يتناقض مع فكرة الطبقات على الإطلاق.

2) كائن العمل معقد للغاية لإنقاذه مباشرة في BD. في هذه الحالة ، من الأفضل تقديم طبقة جديدة "Mappers" الوسيطة.

للتغلب على كل هذه القضايا التي أجعلها على وجه التحديد واجهة لـ DAL مستقلة عن كائنات العمل. أستخدم فئات "الصف" بدلاً من ذلك - تمثيل سجل واحد في قاعدة البيانات أو XML. في .NET 3.5 يمكن استخدام فئات LINQTOSQL Autogenerated لهذا الغرض.

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