سؤال

أنا أعمل على مشروع باستخدام ASP.NET MVC ونموذج المستودع.لدي فئات مستودع وخدمات تستهلك فئات المستودع هذه.سؤالي هو:هل من الصحيح إرجاع IQueryable من فئة المستودع الخاصة بي ثم استخدام ".Where" و".OrderBy" في إحدى الخدمات لإنشاء قائمة؟إذا كانت الإجابة بنعم، فهل هذه هي أفضل الممارسات؟

شكرًا!

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

المحلول

وبالنسبة للمبتدئين: ليس هناك "حق" أو "خطأ" هنا. انها مجرد مسألة ما يعمل على نحو أفضل بالنسبة لك والنظام الذي يبنون. على سبيل المثال، لم روب Conery تطبيق نموذج ASP.NET يسمى واجهة المخزن مع بالضبط نمط كنت تصف وأشعلت حربا لهب كبيرة. إن جزءا كبيرا من المناقشة تطورت حول نمط مستودع الذي يعتبر "نسخة أصلية واحدة" كما وصفها اريك ايفانز في كتابه <لأ href = "https://rads.stackoverflow.com/amzn/click/com/0321125215" يختلط = "نوفولو noreferrer"> المجال تصميم مدفوعة و التي تصف واجهة مستودع واحدة تقبل و / أو إرجاع الحالات الفعلية (القوائم من الحالات) وليس بعض اجهة الاستعلام.

والكثير حتى لنظرية. ماذا تختار للنظام الخاص بك؟ والسبب انني لن تختار مباشرة الطريق IQueryable هو أنه تسرب في الواقع قليلا من استراتيجية استمرار جهدي لطبقة العميل (وهي طبقة الخدمة في هذه الحالة). لأنه في المقام الأول المنطقي لإرجاع IQueryable إذا كنت استرجاع الكائنات من قاعدة البيانات باستخدام LINQ إلى [طريقة الوصول إلى قاعدة البيانات (مثل SQL، الكيانات، ...)]. عندها فقط سوف .حيث أو .OrderBy يتم تحسين نتيجة الاستعلام الخاص بك. من الواضح لا معنى له إذا كنت تستخدم بعض الوصول إلى قاعدة البيانات رمز رمز أن يحصل على قائمة كاملة التي ثم فضح من مستودع استخدام LINQ إلى كائنات. هكذا وباختصار: أنت تفعل ربط طبقة العميل الخاص في استراتيجية الوصول إلى قاعدة البيانات استنادا LINQ-كنت تستخدم

.

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

وهكذا في النهاية يتعلق الامر ل: كل ما يعمل على نحو أفضل بالنسبة لك على ما يرام

نصائح أخرى

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

بمعنى آخر، ليس من المنطقي الحصول على القائمة الكاملة للمستخدمين، لمجرد اختيار الشخص الذي اسمه "Jackolantern".

أفضل طريقة للتفكير في الأمر هي هكذا - إذا قررت التبديل من MSSQL إلى MySQL غدًا، فهل سيتعين عليك تكرار منطق العمل؟ إذا كان الأمر كذلك، فأنت تستخدم مستودعك بشكل غير صحيح.

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

وعادة أضع واجهة من الطبقات مستودع في طبقة المجال والتطبيقات الفعلية في طبقة الخدمة.

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