ما هي الكائنات التي يجب عليك إرجاعها من طبقة الوصول إلى البيانات إلى طبقة الأعمال في نظام n-tier

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

سؤال

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

//data access tier
public class DataAccess{

   public interface IPerson{
      int ID{ get; set; }
      string Name{ get; set; }
   }

   internal class Person : IPerson{
      private int id;
      private string name;

      public int ID{ get{return id; } set{ id=value; } }
      public int Name{ get{retutn name; } set{ name=value; }
   }

   public static IPerson GetPerson(int personId)
   {
      //get person record from db, populate Person object
      return person;  
   }
}

//business tier
public class Person : IPerson{
   private int id;
   private string name;

   public int ID{ get{return id;} set{id=value;} }
   public string Name{ get{return name;} set{name=value;} }

   public void Populate(int personId){
      IPerson temp = DataAccess.GetPerson(personId);
      this.ID = temp.ID;
      this.Name = temp.Name;
   }
}

ولكن كل هذا يبدو مرهقا بعض الشيء؟هل هناك حل أكثر أناقة لهذه المشكلة؟هل يجب علي إرجاع DataRow من طبقة الوصول إلى البيانات إلى طبقة الأعمال بدلاً من ذلك؟

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

المحلول

لا تحتاج إلى تكرار تعريف الفئة في طبقة الوصول إلى البيانات (DAL).

يمكنك إنشاء كيانات الأعمال الخاصة بك كحاويات "غبية" في تجميع منفصل، على سبيل المثال.يمكن أن تكون فئة الشخص الخاصة بك: -

public class Person
{
    int ID { get; set: }
    string Name { get; set: }
}

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

هذا المقال بقلم Imar Spaanjaars لديه شرح جميل لهذا النمط.

نصائح أخرى

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

لحل مشكلتك المحددة، يمكنك إما:

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

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

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

والطبقة عملك يحيل الى واجهات بدلا من الرجوع مباشرة على كائنات الوصول إلى البيانات. وحقن التبعية عن طريق الحاويات اللجنة الاولمبية الدولية (مثل قلعة وندسور على سبيل المثال) يسمح لك لتحقيق ذلك.

وهذا ما يسمى تقنية فصل ربطه ويوصف هنا:

http://www.martinfowler.com/eaaCatalog/separatedInterface.html

ويمكن الاطلاع على أفضل تفسير لهذه التقنية لقد رأيت في هذه المقالة على أفضل الممارسات NHibernate كتبها بيلي مكفرتي.

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

وهذه المادة لديه الكثير من المعلومات التي تخص NHiberbate، ولكن نصف جيدة من انها مجرد معلومات مؤكدة على تصميم تطبيقات ليتم المتباعدة وسهولة وحدة اختبار.

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

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