سؤال

أنا بناء تطبيق على أعلى من إرث قاعدة البيانات (التي لا أستطيع تغيير).أنا باستخدام Linq to SQL من أجل الوصول إلى البيانات ، مما يعني لدي (Linq to SQL) فئة لكل جدول.

بلدي نموذج المجال لا تتطابق مع قاعدة البيانات.على سبيل المثال, هناك نوعان من الجداول اسمه Users و Employees, ولذلك لدي اثنين من Linq to SQL classes اسمه User و Employee.ولكن في نموذج المجال أود أن يكون User الدرجة التي يجب أن تحتوي على بعض الحقول من جدول (ولكن أنا لا أهتم الكثير من المجالات الأخرى من هذه الجداول).

لست متأكدا كيف ينبغي تصميم لي مستودعات:

  • يجب أن مستودعات أداء رسم الخرائط بين Linq to SQL classes (مثلا ، User, Employee) إلى المجال الطبقات (User) فقط العودة المجال الطبقات إلى التطبيق
  • أو أن مستودعات عودة Linq to SQL classes و ترك التعيين إلى المتصل

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

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

المحلول

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

مع تلك التصريحات الغامضة, لديك فرصة ممتازة هنا.

بناء مكافحة الفساد طبقة ، مما يسمح لك لبدء التحرك من إرث DB في نفس الوقت.

هذا هو آخر فصل في DDD قواعد اللعبة التي تمارسها.مكافحة الفساد طبقة يستخدم واجهة مع تركة النظام باستخدام واجهات, المترجمين, و محولات عزل إرث DB مع نقية نموذج المجال.

الآن, قد يكون هذا العمل أكثر بكثير مما كنت تريد.لذا عليك أن تسأل نفسك في هذه النقطة:

هل تريد أن تبدأ عملية ينطلق من هذا الإرث ديسيبل ، أو يبقى للحياة التطبيق ؟

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

إذا كان الجواب هو أن التركة DB سوف تبقى مدى حياة المشروع ، ثم هو المهمة الخاصة بك أسهل بكثير.استخدام النطاق الخاص بك خدمات (على سبيل المثالUserEmployeeService) للوصول إلى مكافحة الفساد UserFacade و EmployeeFacade (على غرار "خدمة التحكم عن بعد" مفهوم).

ضمن واجهات الوصول إلى إرث db باستخدام محولات (مثلا ، LegacyDbSqlDatabase) للحصول على الخام legacyUser().ستكون الخطوة التالية لاستخدام UserTranslator() و EmployeeTranslator() معين يقوم بتحويل إرث بيانات المستخدم في المجال الفعلي هو نسخة من المستخدم() الكيان ، والعودة من UserFacade إلى UserEmployeeService ، حيث يتم دمجها مع الموظف الكيان الذي جاء من نفس المكان.

هذا كان الكثير من الكتابة...

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

نصائح أخرى

لا يتوافق DDD وLinq To SQL معًا بشكل جيد نظرًا لأن الفئات التي تم إنشاؤها لا تهدف إلى الانحراف بشكل كبير عن بنية جدول قاعدة بياناتك.سيتعين عليك إما تعيين فئاتك بطريقة تجعل العمل مع Linq إلى SQL أمرًا مؤلمًا أو العيش مع نموذج كائن غير مثالي.

إذا كنت تريد حقًا استخدام DDD ونمط المستودع، فانتقل إلى Entity Framework أو حتى NHibernate الأفضل.

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