Skip to content

6. Spring لتكوين التطبيقات ثلاثية الطبقات

نقترح هنا دراسة مثال يوضح كيف يمكن استخدام Spring لتكوين التطبيقات ثلاثية الطبقات. ومن الأمثلة الشائعة على هذا النوع من التطبيقات تطبيقات الويب.

6.1. المشكلة

نرغب في بناء تطبيق ثلاثي الطبقات له البنية التالية:

  • ستصبح الطبقات الثلاث مستقلة عن بعضها البعض بفضل استخدام الواجهات
  • وسيتم تحقيق تكامل الطبقات الثلاث بواسطة Spring
  • سيتم إنشاء حزم منفصلة لكل طبقة من الطبقات الثلاث، والتي ستسمى [control] و [domain] و [dao]. وستحتوي حزمة إضافية، وهي [tests]، على تطبيقات الاختبار.

6.2. طبقة الوصول إلى البيانات

ستقوم الطبقة DAO بتنفيذ الواجهة التالية:

Namespace istia.st.spring3tier.dao
    Public Interface IDao
         ' القيام بشيء ما في الطبقة [dao]
        Function doSomethingInDaoLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • كتابة فئتين Dao1Impl1 و Dao1Impl2 اللتين تنفذان الواجهة IDao. ستُرجع الطريقة Dao1Impl1. doSomethingInDaoLayer القيمة a+b، وستُرجع الطريقة Dao1Impl2. doSomethingInDaoLayer القيمة a-b.
  • اكتب فئة اختبار NUnit لاختبار الفئتين السابقتين

6.3. طبقة الأعمال

ستقوم طبقة الأعمال بتنفيذ الواجهة التالية:

Namespace istia.st.spring3tier.domain
    Public Interface IDomain
         ' القيام بشيء ما في الطبقة [domain]
        Function doSomethingInDomainLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • كتابة فئتين Domain1Impl1 و Domain1Impl2 اللتين تنفذان الواجهة IDomain. ستحتوي هاتان الفئتان على حقل خاص من النوع IDao يمكن تهيئته عبر خاصية عامة. ستقوم الطريقة doSomethingInDomainLayer الخاصة بالفئة [DomainImpl1] بزيادة قيمتي a و b بمقدار وحدة واحدة، ثم تمرير هذين المعلمتين إلى الطريقة doSomethingInDaoLayer الخاصة بالكائن من النوع IDao1 الذي تم استلامه. ستقوم الطريقة doSomethingInDomainLayer التابعة للفئة [Domain1Impl2elle] بتخفيض قيمتي a و b بمقدار وحدة واحدة قبل القيام بنفس الإجراء.
  • كتابة فئة اختبار NUnit لاختبار الفئتين السابقتين

6.4. طبقة واجهة المستخدم

ستقوم طبقة واجهة المستخدم بتنفيذ الواجهة التالية:

Namespace istia.st.spring3tier.control
    Public Interface IControl
         ' القيام بشيء ما في الطبقة [control]
        Function doSomethingInControlLayer(ByVal a As Integer, ByVal b As Integer) As Integer
    End Interface
End Namespace
  • كتابة فئتين Control1Impl1 و Control1Impl2 اللتين تنفذان الواجهة IContro1. ستحتوي هاتان الفئتان على حقل خاص من النوع IDomain يمكن تهيئته عبر خاصية عامة. ستقوم الطريقة doSomethingInControlLayer الخاصة بالفئة [Control1Impl1] بزيادة قيمتي a و b بمقدار وحدة واحدة، ثم تمرر هذين المعلمتين إلى الطريقة doSomethingInDomainLayer الخاصة بالكائن من النوع IDomain1 الذي تم استلامه. أما الطريقة doSomethingInControlLayer التابعة للفئة [Control11Impl2]، فستقلل قيمتي a و b بمقدار وحدة واحدة قبل القيام بنفس الإجراء.
  • كتابة فئة اختبار NUnit لاختبار الفئتين السابقتين

6.5. التكامل مع Spring

  • اكتب ملف تكوين Spring يحدد الفئات التي يجب أن تستخدمها كل طبقة من الطبقات الثلاث السابقة
  • اكتب فئة اختبار NUnit تستخدم تكوينات Spring مختلفة، من أجل إبراز مرونة التطبيق المكتوب
  • كتابة تطبيق مستقل (طريقة main) يمرر معلمتين إلى الطريقة [doSomethingInControlLayer] في الواجهة IControl التي تم تنفيذها، ويعرض النتيجة التي تنتجها الواجهة.