كيف يتم تطبيق فصل استعلام الأمر (CQS) عند استخدام Orm؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

المبدأ وراء النمط المعماري CQS هو أنك تفصل استفساراتك وأوامرك إلى مسارات مميزة. من الناحية المثالية، يمكن قراءة متجر الثبات الخاص بك مقسمة / الكتابة، ولكن في حالتي، هناك قاعدة بيانات واحدة طبيعية.

إذا كنت تستخدم Orm (Nibernate في حالتي)، فمن الواضح أن Orm يستخدم عند إصدار الأوامر. ولكن ماذا عن جميع الاستفسارات المختلفة التي تحتاج إلى تشغيلها لتشكيل البيانات (DTOS) لشاشات المستخدم، هل هي ممارسة شائعة لمخلاصات orm عند القيام بجانب الاستعلام من CQS؟

أين يجب أن أقوم بتطبيق استفساراتي وتوقعات DTO؟ ADO.NET مستقيم (DataReaders، Dtos، DataTables، المخزن Procs)؟ بعض الاستفسارات فريدة من نوعها للغاية وتتضمن الكثير من الانضمام لسحب كل شيء معا. لا أريد إنكار قاعدة البيانات للاستعلامات، لكنني يمكن أن أقوم بإنشاء طرق عرض (إنكار الرجل الفقير).

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

المحلول

أنا أفترض بواسطة CQs تقصد نمط DDD المعماري AKA cqrs., ، وليس بدقة التقليدية CQS. المبدأ.

ما زلت أستخدم Thhibernate لنموذج القراءة فقط. هناك العديد من المزايا مثل الاستفسارات المستقبلية والمتعددة، تحميل كسول / حريصة، إلخ ... من شأنها تحسين دردشة DB. بالإضافة إلى ذلك، سيكون من الأسهل إنشاء استفسارات مع Orm إذا سمح UI للمستخدم بتغيير جملة WHERE في الأساس.

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

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

نصائح أخرى

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

ولكن لا يزال بإمكان nhibernate خيارا جيدا ... لم يعد مجرد الافتراضي التلقائي (الذي هو في بعض الأحيان هو جانب القيادة).

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

نحن نستخدم EF لمقطع الأمر، و ADO.NET مستقيم => DTOS لسلسلة الاستعلام. مزايا:

1) القدرة على تحسين استعلامات SQL واستخدام ميزات متجر DB المتقدمة غير مستخرجة في طبقة Orm

2) أقل النفقات العامة

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

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

لا يزال بإمكانك استخدام Nibernate للقراءة من مخزن البيانات الخاص بك، ولكن قد ترغب في تحقيق ذلك من خلال إنشاء فئتين مختلفتين لتغليف الوصول إلى البيانات الخاصة بك. سيكون من الفئة الأولى أساليب لقراءة (الاستعلام) مخزن البيانات، سيكون من الفئة الأخرى أساليب إصدار الأوامر (إضافة وتحديث وحذف) إلى مخزن البيانات.

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

أحب الاحتفاظ بفصل أورم عن القراءات والكتابة حتى أستخدمه (وأستعبه):

nhibernate. لأوامر - خرائط جميلة نموذج المجال الخاص بي

dapper.net. للاستعلامات - خرائط بشكل جميل DTO الخاص بي وتسمح بتسمية التسمية إذا كان الاستعلام معقد للغاية.

إنها زوجين مثاليين تماما مثل هان سولو وشوانباكا.

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