Skip to content

6. اسپرینگ برای پیکربندی برنامه‌های سه‌لایه

در اینجا هدف ما این است که با استفاده از یک مثال بررسی کنیم چگونه می‌توان از Spring برای پیکربندی برنامه‌های سه‌لایه استفاده کرد. یک مثال رایج از این نوع برنامه، یک برنامه وب است.

6.1. مسئله

ما می‌خواهیم یک برنامه سه‌لایه با ساختار زیر بسازیم:

  • سه لایه از طریق استفاده از رابط‌ها مستقل خواهند شد
  • اسپرینگ برای یکپارچه‌سازی سه لایه استفاده خواهد شد
  • ما برای هر یک از سه لایه، پکیج‌های جداگانه‌ای ایجاد خواهیم کرد که آن‌ها را [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 ارسال کرده و نتیجه بازگردانده‌شده توسط رابط را نمایش دهد.