سؤال

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

وبعبارة أخرى:يجب أن تكون خدمات صنع مختلف Linq to SQL الاستفسارات على مخزن ؟ أم أن كل الاستفسارات تكون مسبقا في مستودع و منطق الأعمال ببساطة أن تقرر أي طريقة للاتصال ؟

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

المحلول

في الواقع كنت قد طرحت سؤال هنا حاليا توليد الكثير من النقاش في المجتمع المطور - انظر متابعة تعليقات أن مستودع فضح IQueryable?

مستودع يمكن - ويجب - إنشاء مزيج معقد الكائنات التي تحتوي على العديد من الكيانات المرتبطة بها.في المجال يحركها التصميم ، وتسمى هذه المجاميع - مجموعات من الكائنات المرتبطة بتنظيم إلى بعض بنية متماسكة.التعليمات البرمجية الخاصة بك لا يجب أن ندعو GetCustomer(), GetOrdersForCustomer(), GetInvoicesForCustomer() بشكل منفصل فقط myCustomerRepository.Load(customerId), و تعود عميق وجوه العملاء مع هذه الخصائص بالفعل مثيل.وأود أن أضيف أيضا أنه إذا كنت إرجاع الكائنات الفردية على أساس محددة جداول قاعدة البيانات, ثم وهذا هو تماما نهج صحيح ، ولكن ليس حقا مستودع في sé - انها مجرد بيانات-طبقة الوصول.

فمن ناحية ، هناك حجة مقنعة أن Linq إلى كائنات SQL مع "الذكية" خصائص و المؤجلة التنفيذ (أيعدم تحميل العملاء.أوامر حتى يمكنك استخدامها في الواقع) هي صالحة تماما تنفيذ نمط مستودع, لأنك في الواقع لا تشغيل قاعدة البيانات رمز, أنت تعمل LINQ البيانات (والتي يتم ترجمتها إلى DB البرمجية الأساسية LINQ موفر)

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

نصائح أخرى

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

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

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

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