سؤال

أنا في البداية تم تصميم نظام بلدي التالية s# العمارة سبيل المثال المبينة في هذه المادة codeproject (للأسف أنا لا أستخدم NHibernate).والفكرة الأساسية هي أن لكل كائن المجال التي تحتاج إلى التواصل مع استمرار طبقة سيكون لديك المقابلة كائن الوصول إلى البيانات في المكتبة المختلفة.كل كائن الوصول إلى البيانات تنفذ واجهة وعندما كائن المجال يحتاج إلى الوصول إلى البيانات الوصول إلى الأسلوب دائما ضد رموز واجهة أبدا ضد DAOs أنفسهم.

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

ومن المثير للاهتمام أن العديد من هذه DAOs (المقابلة لها واجهات) هي بسيطة جدا المخلوقات - الأكثر شيوعا وحيد GetById الأسلوب ().أنا في نهاية المطاف مع مجموعة كاملة من الأشياء مثل

public interface ICustomerDao {
  Customer GetById(int id);
}

public interface IProductDao {
  Product GetById(int id);
}
public interface IAutomaticWeaselDao {
  AutomaticWeasel GetById(int id);
}

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

public interface SimpleObjectRepository {
      Customer GetCustomerById(int id);
      Product GetProductById(int id);
      AutomaticWeasel GetAutomaticWeaselById(int id);
      Transaction GetTransactioinById(int id);
}
public interface TransactionDao {
  Transaction[] GetAllCurrentlyOngoingTransactionsInitiatedByASweatyGuyNamedCarl();
}

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

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

المحلول

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

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

هذا يبدو مثل الكثير من الجهد ولكن بخلاف استعلامات مخصصة معظم التعليمات البرمجية على الأقل إذا كنت تستخدم الحديثة ORM جدا بسيطة لتنفيذ ذلك يمكنني استخدام الميراث (ReadWriteRepositoryBase حيث T:IAggregateRoot) و/أو تكوين (الدعوة إلى RepositoryHelper الدرجة).قاعدة الطبقة قد الأساليب التي تنطبق في جميع الحالات ، مثل GetById.

ويساعد هذا الأمل.

نصائح أخرى

أنا أعمل في PHP, ولكن لدي شيء مماثل أنشئت من أجل بلدي طبقة الوصول إلى البيانات.لقد نفذت واجهة التي تبدو شيئا مثل هذا:

interface DataAccessObject
{
public static function get(array $filters = array(), array $order = array(), array $limit = array());
public function insert();
public function update();   
public function delete();
}

ثم كل من كائنات الوصول إلى البيانات تعمل شيئا من هذا القبيل:

class DataAccessObject implements DataAccessObject
{
    public function __construct($dao_id = null) // So you can construct an empty object
    {
        // Some Code that get the values from the database and assigns them as properties
    }
    public static function get(array $filters = array(), array $order = array(), array $limit = array()) {};  // Code to implement function
    public function insert() {};  // Code to implement function
    public function update() {};  // Code to implement function 
    public function delete() {};  // Code to implement function        
}

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

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

كما sidenote على .صافي التنمية ، بحثت في الإطار الذي يعالج البنية الأساسية من طبقة الوصول إلى البيانات ، دون سرعة الصوت ؟ أنا لا أنصح تبحث في هذا الإطار: http://subsonicproject.com/.

أو PHP تطوير إطار عمل مثل زند الإطار من شأنه أن يوفر وظائف مماثلة: http://framework.zend.com

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

أفترض أنه على الرغم من عدم استخدام NHibernate الخاص بك لا تزال تستخدم قاعدة عامة الدرجة لو تحميل/حفظ الحاويات الخاصة بك أي

public class BaseDAO<T> : IDAO<T> 
{
     public T Save(T entity)
     { 
       //etc......
     }
}
public class YourDAO : BaseDAO<YourEntity>
{
}

أعتقد أنه من دون NHibernate كنت تستخدم التفكير أو بعض الأخرى مشنيسم لتحديد ما SQL/SPROC الاتصال ؟

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

أنا أيضا باستخدام نمط مستودع بالنسبة لي داو أنا سعيدة جدا مع ذلك.نعم كنت في نهاية المطاف مع عدد غير قليل من فئات صغيرة, لكنه جدا للصيانة.انها قليلا أكثر قوة إذا كنت تستخدم IQueriable واجهة (LINQ.) هل يمكن أيضا استخدام الأدوية (شيء من هذا القبيل T GetById<T>(int id)) إذا كان لديك متسقة جدا بنية قاعدة البيانات.

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

أود معرفة ما الذي يجعل النظام الخاص بك أكثر للصيانة و من السهل أن نفهم فعل ذلك.

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