المعمارية لبعض الكائنات الأعمال / طبقة الوصول إلى قاعدة البيانات

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

فمن الممكن أن يكون العديد من تخزين البيانات الطبقات التي تنفذ الوصول إلى نفس الكائن - على سبيل المثال الرئيسية "قاعدة بيانات" تخزين البيانات المصدر أن تنفذ معظم الكائنات آخر "ldap" المصدر أن تنفذ كائن المستخدم.في هذا السيناريو ، يمكن للمستخدم اختياريا تأتي من مصدر LDAP, ربما قليلا مع وظائف مختلفة (على سبيل المثال ، من غير الممكن حفظ/تحديث كائن المستخدم), لكن على خلاف ذلك يتم استخدامها من قبل التطبيق بنفس الطريقة.آخر تخزين البيانات نوع قد يكون خدمة ويب ، أو قاعدة بيانات خارجية.

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

  • الأعمال كائنات قاعدة الطبقات ، وتخزين البيانات الكائنات وراثة كائنات الأعمال.رمز العميل يتعامل مع البيانات تخزين الكائنات.

    في هذه الحالة, التجارية المشتركة القواعد الموروثة على كل البيانات تخزين الكائن هو تخزين البيانات الكائنات التي يتم استخدامها مباشرة من قبل العميل رمز.

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

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

  • كائنات الأعمال تغليف تخزين البيانات الكائنات.

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

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

  • الأعمال كائنات قاعدة الطبقات ، مصدر البيانات الكائنات ترث من الكائنات الأعمال.رمز العميل يتعامل أساسا مع قاعدة الطبقات.

    هذا هو مماثل الطريقة الأولى ولكن رمز العميل يعلن المتغيرات قاعدة الكائن الأعمال وأنواع الحمل()/إنشاء()/etc أساليب ثابتة على كائنات الأعمال العائد المناسب البيانات المصدر-مكتوب الكائنات.

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

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

أنا أبحث عن بعض النصائح العامة هنا على الطريقة التي من الأفضل استخدام (أو لا تتردد في اقتراح أي شيء آخر).... ولماذا

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

المحلول

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

هذا يقع في الفئة الثانية أعلاه (كائنات الأعمال تغليف تخزين البيانات الكائنات) ، ولكن يفصل البيانات دلالات من آليات التخزين بشكل أكثر وضوحا

نصائح أخرى

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

كما قال: الأعمال التجارية الخاصة بك لا ينبغي أن يتعرض إلى أي شيء ولكن DTO و الواجهة.

نعم.العميل الخاص بك يمكن التعامل مع DTOs.إنها طريقة مثالية لتمرير البيانات من خلال التطبيق الخاص بك.

عموما أنا أفضل "الكائن الأعمال بتغليف البيانات كائن/التخزين" أفضل.ومع ذلك ، في المدى القصير قد تجد عالية التكرار مع البيانات الخاصة بك الأشياء و الأعمال التجارية الخاصة بك من الأشياء التي قد تبدو غير جديرة بالاهتمام.هذا صحيح لا سيما إذا كنت تختار ORM كأساس البيانات الخاصة بك-طبقة الوصول إلى (دال).ولكن في المدى الطويل هو المكان الحقيقي سداد هو:تطبيق دورة الحياة.كما هو موضح, فإنه ليس من غير المألوف "البيانات" تأتي من واحد أو أكثر من التخزين الفرعية (على سبيل المثال لا RDBMS) ، خاصة مع ظهور الحوسبة السحابية ، كما يشيع الحال في النظم الموزعة.على سبيل المثال, قد يكون لديك بعض البيانات التي تأتي من راحة خدمة قطعة أخرى أو كائن من RDBMS آخر من ملف XML, LDAP, وهلم جرا.مع هذا الإدراك ، وهذا يعني أهمية جيد جدا التغليف من الوصول إلى البيانات من الأعمال.رعاية ما تبعيات فضح (دي) من خلال جهاز c-مواصفات و خصائص أيضا.

وقال نهج لقد تم اللعب مع وضع "اللحوم" من العمارة في عمل وحدة تحكم.التفكير المعاصر البيانات الوصول إلى أكثر كمورد من التفكير التقليدي ، تحكم ثم يقبل في URI أو أي شكل آخر من البيانات الوصفية التي يمكن استخدامها لمعرفة ما هي البيانات الموارد يجب إدارة الأعمال الكائنات.ثم الأعمال كائنات لا أنفسهم لتغليف البيانات ؛ بل تحكم لا.هذا يبقي عملك الأشياء خفيفة الوزن و محددة ويسمح جهاز تحكم لتوفير الأمثل ، composability المعاملات أجواء, وهكذا دواليك.علما بأن وحدة التحكم الخاصة بك ثم "المضيف" الأعمال التجارية الخاصة بك وجوه مجموعات, مثل الكثير من تحكم قطعة من العديد من ORMs القيام به.

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

في شبه رمز:

using(MyConcreteBusinessContext ctx = new MyConcreteBusinessContext("datares://model1?DataSource=myserver;Catalog=mydatabase;Trusted_Connection=True ruleres://someruleresource?type=StaticRules&handler=My.Org.Business.Model.RuleManager")) {

User user = ctx.GetUserById("SZE543");
user.IsLogonActive = false;
ctx.Save();
}

//a business object
class User : BusinessBase {
  public User(BusinessContext ctx) : base(ctx) {}

  public bool Validate() {
    IValidator v = ctx.GetValidator(this);
    return v.Validate();
  }
}

// a validator
class UserValidator : BaseValidator, IValidator {
 User userInstance;
 public UserValidator(User user) {
  userInstance = user;
 }

 public bool Validate() {
   // actual validation code here
   return true;
 }
}

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

تحقق من CSLA.net بواسطة روكي Lhotka.

حسنا ، أنا هنا ، فإن العامل المشترك جريج المذكورة.

جريج وصف البدائل ما تم النظر بدقة كبيرة.أنا فقط أريد أن أضيف بعض الاعتبارات الوضع الوصف.

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

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

هذه المسؤولية يمكن تنفيذها في العديد من الطرق:يمكن أن يكون كائن اتصال من نوع معين لكل البيانات التخزين ؛ يمكن segregared أساليب الدعوة إلى إنشاء جديد بو الحالات.... الخ

التحيات ،

مايكل

CLSA قد حول لفترة طويلة.ومع ذلك أنا أحب النهج التي يتم مناقشتها في إيريك إيفانز الكتاب http://dddcommunity.org/

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