چگونه قوانین معماری را در سی شارپ اجرا کنیم

شنبه 10 اردیبهشت 1401

پیاده سازی قوانین معماری در زبان برنامه نویسی سی شارپ از اهمیت بسیار زیادی برخوردار است. یونیت تست این است که چگونه اطمینان حاصل کنیم که بلاک های کدی که ایجاد می کنیم همان کاری که ما قصد انجام آن را دارید را انجام می دهند.

 چگونه قوانین معماری را در سی شارپ اجرا کنیم

برخی از فریم ورک های متن باز برای گرفتن یونیت تست از اپلیکیشن های دات نت وجود دارند که از جمله آنها می توان به NUnit و xUnit.Net اشاره کرد. فراموش نکنید که شما همواره باید یونیت تست را در گردش کار توسعه نرم افزار خود در زبان سی شارپ و سایر زبان ها بگنجانید تا خطاهای موجود در اپلیکیشن را کاهش داده و یا این که آنها را به طور کامل حذف کنید.

یونیت تست ها و اهمیت استفاده از آنها

شما ممکن است برای گرفتن یونیت تست از برنامه های خود در سی شارپ از ابزارهایی مانند ArchUnit یا NetArchTest نیز استفاده کنید. با استفاده از این ابزارها شما می توانید یونیت تست هایی را بنویسید که به شما کمک می کنند تا قوانین معماری را اجرا کنید. این ابزارها از ArchUnit در جاوا الهام گرفته شده اند. NetArchTest که توسط Ben Morris طراحی و ساخته شده است یک فریم ورک ساده است که می توان از آن برای اجرای قوانین معماری در فریم ورک دات نت یا .NET Core استفاده کرد. علاوه بر این شما می توانید از آن در پروژه های دات نت 6 نیز استفاده کنید.

در ادامه این مقاله بیشتر درباره اهمیت اجرای قوانین معماری و نحوه استفاده از NetArchTest صحبت خواهیم کرد و اطلاعاتی را در اختیار شما قرار می دهیم. برای کار کردن با نمونه کدهایی که در این مقاله درباره آنها صحبت می کنیم باید نسخه 2022 ویژوال استودیو را نصب کنید.

لزوم اجرای قوانین معماری در سی شارپ

فریم ورک ها و ابزارهای تجزیه و تحلیل کد استاتیک زیادی برای بررسی کیفیت کد در دات نت وجود دارد که شما می توانید از آنها برای دات نت 6 نیز استفاده کنید. برای شروع اجرای قوانین معماری در سی شارپ دو ابزار محبوب SonarQube و NDepend وجود دارند که می توانند عملکرد بسیار خوبی را به شما ارائه دهند. نکته مهمی که باید به آن دقت داشته باشید این است که تجزیه و تحلیل کد استاتیک به عنوان بخشی از ویژوال استودیو در دسترس است که می توانید از آن استفاده کنید.

با این حال نباید فراموش کنید که تنها تعداد کمی از این ابزارها به شما کمک می کنند تا الگوهای طراحی در معماری را حفظ کرده یا قوانین معماری را در کد منبع خود اعمال کنید. اگر شما به طور مرتب این قوانین را تایید یا اجرا نکنید طراحی یا معماری برنامه شما به مرور زمان دچار افت می شود. در نهایت شما متوجه خواهید شد که حفظ کردن پایگاه کد تبدیل به یک مسئله چالش برانگیز برای شما شده است.

نکاتی در خصوص اجرای قوانین معماری 

با وجود این که ابزارهای تجزیه و تحلیل استاتیک کد به شما کمک می کنند تا بهترین متدهای عمومی را تایید یا اجرا کنید شما می توانید از NArchTest برای ایجاد یونیت تست ها استفاده کنید که قوانین معماری را در اپلیکیشن های دات نت 6 و .NET core اجرا می کنند. دقت داشته باشید که این ابزارها شامل قراردادهایی برای طراحی کلاس ها، نام گذاری آنها و ایجاد وابستگی ها در پایگاه کد شما می باشند.

شما می توانید از NArchTest در متدهای یونیت تست خود استفاده کنید و سپس این متدهای آزمایشی را در پایپ لاین build و انتشار بگنجانید تا قوانین معماری به طور خودکار با هر بار ورود تایید شوند.

ساخت پروژه یونیت تست در ویژوال استودیو 2022

پیش از هر چیز اجازه دهید تا یک پروژه یونیت تست را در ویژوال استودیو 2022 ایجاد کنیم که این کار را از طریق قالب xUnit Test Project انجام خواهیم داد. برای این کار کافی است که مراحل زیر را دنبال کنید تا بتوانیم یک پروژه یونیت تست را در سی شارپ ایجاد کنیم:

-          ویژوال استودیو 2022 را راه اندازی کنید.

-          روی گزینه Create new project کلیک کنید.

-          در پنجره Create new project از میان لیست قالب هایی که برای شما نمایش داده می شود گزینه xUnit Test Project را انتخاب کنید.

-          روی گزینه Next کلیک کنید.

-          در پنجره Configure your new project نام و محل قرارگیری پروژه خود را مشخص کنید.

-          در صورت تمایل می توانید گزینه Place solution and project in the same directory را نیز فعال کنید که این مسئله به preferences شما بستگی دارد.

-          روی گزینه Next کلیک کنید.

-          در پنجره Additional Information که در ادامه به شما نمایش داده می شود گزینه دات نت 6.0 را به عنوان فریم ورک هدف خود انتخاب کنید و گزینه Authentication Type را نیز روی همان مقدار None تنظیم کنید.

-          اطمینان حاصل کنید چک باکس های Enable Docker، Configure for HTTPS و Enable Open API Suppor فعال نشده اند چرا که ما قصد نداریم از این ویژگی ها در پروژه خود استفاده کنیم.

-          حال روی گزینه Create کلیک کنید.

پس از طی کردن این مراحل شما یک پروژه جدید xUnit در ویژوال استودیو 2022 خواهید داشت که ما از این پروژه برای اجرای قوانین معماری در سی شارپ استفاده خواهیم کرد.

ساخت یک پروژه Class Library در ویژوال استودیو 2022

در بخش بعدی از اجرای قوانین معماری در سی شارپ اجازه دهید تا به ساخت یک پروژه class library بپردازیم. با دنبال کردن مراحلی که در ادامه برای شما آورده ایم می توانید یک پروژه class library را در ویژوال استودیو 2022 بسازید:

-          ویژوال استودیو 2022 را راه اندازی کنید.

-          روی گزینه Create new project کلیک کنید.

-          در پنجره Create new project از لیست قالب هایی که برای شما نمایش داده می شود گزینه Class Library را انتخاب کنید.

-          در ادامه روی گزینه Next کلیک کنید.

-          در پنجره Configure your new project که برای شما باز می شود نام و مسیر پروژه خود را مشخص کنید.

-          در ادامه روی گزینه Next کلیک کنید.

-          در پنجره Additional Information که در ادامه برای شما نمایش داده می شود دات نت 6.0 را به عنوان فریم ورک هدف خود انتخاب کنید

-          روی گزینه Create کلیک کنید.

با طی کردن این مراحل شما می توانید یک پروژه  Class Library در ویژوال استودیو 2022 ایجاد کنید که در ادامه از آن استفاده خواهیم کرد.

ساخت کلاس های مدل در دات نت 6 برای اجرای قوانین معماری در سی شارپ

فرض کنید نامی که برای پروژه Class Library قرار داده ایم Core.Infrastructure است. در پنجره Solution Explorer این پروژه را انتخاب کنید و سپس مسیر Add -> New Folder را طی کنید تا یک پوشه solution جدید اضافه کنید. دقت داشته باشید که در این جا مدل ها باید همان نامی که در solution وجود دارد را داشته باشند.

حال کلاسی با نام BaseModel را ایجاد کنید که این کار باید داخل مدل های پوشه solution انجام شود و در ادامه قطعه کد زیر را نیز به آن اضافه کنید:

public abstract class BaseModel
    {
        public int Id { get; set; }
    }

حال دو کلاس مدل دیگر را نیز ایجاد کنید و نام آنها را Product و Customer قرار دهید. هر یک از این دو کلاس باید کلاس BaseModel را extend  کرده باشند که این مسئله به طور کامل در زیر نشان داده شده است:

public class Product: BaseModel
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}
public class Customer: BaseModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

ساخت کلاس های سرویس در دات نت 6

برای اجرای قوانین معماری در سی شارپ شما باید کلاس های سرویس مربوط به زبان سی شارپ را نیز در دات نت 6 پیاده سازی کنید. برای انجام این کار یک پوشه solution دیگر را در همان پروژه ایجاد کنید و نام آن را Services قرار دهید. در ادامه اینترفیسی را ایجاد کنید و نام IBaseService را قرار داده و سپس آن را داخل پوشه solution قرار دهید. در ادامه شما باید قطعه کد زیر را نیز به آن اضافه کنید:

public interface IBaseService
{
    public void Initialize();
}

نکاتی درباره ساخت کلاس سرویس برای سی شارپ در دات نت 6

متد Initialize باید توسط تمام کلاس ها پیاده سازی شود که این متد نیز اینترفیسی که در بخش قبل درباره آن صحبت کردیم را پیاده سازی می کند. کلاس های ProductService و CustomerService نیز اینترفیس IBaseService را پیاده سازی می کنند که در قطعه کد زیر نمایش داده شده است.

//ProductService.cs
using Core.Infrastructure.Models;
namespace Core.Infrastructure.Services
{
    public sealed class ProductService: IBaseService
    {
        public void Initialize()
        {
            //Write your implementation here
        }
        public List<Product> GetProducts()
        {
            return new List<Product>();
        }
    }
}

//CustomerService.cs
using Core.Infrastructure.Models;
namespace Core.Infrastructure.Services
{
    public sealed class CustomerService: IBaseService
    {
        public void Initialize()
        {
            //Write your implementation here
        }
        public List<Customer> GetCustomers()
        {
            return new List<Customer>();
        }
    }
}

توجه داشته باشید که برای اهدافی که ما در این پیاده سازی ساده دنبال می کنیم متد Initialize از هر دو کلاس ProductService و CustomerService خالی قرار داده شده است. بنابراین شما می توانید پیاده سازی مخصوص به خود را داخل آنها بنویسید.

نصب کردن پکیج NetArchTest.Rules NuGet

برای اجرای قوانین معماری در سی شارپ شما باید پکیج NetArchTest.Rules NuGet را نیز روی سیستم خود نصب کنید. برای اضافه کردن پکیج NetArchTest.Rules NuGet به پروژه خود کافی است که پروژه خود را در  Solution Explorer انتخاب کنید و با کلیک راست روی آن گزینه Manage NuGet Packages را انتخاب کنید. در پنجره NuGet Package Manager به دنبال پکیج NetArchTest.Rules باشید و آن را نصب کنید.

علاوه بر این شما می توانید این پکیج را از طریق کنسول NuGet Package Manager نیز نصب کنید که این کار با استفاده از دستور زیر انجام می شود:

PM> Install-Package NetArchTest.Rules

نوشتن یونیت تست های معماری در سی شارپ و دات نت 6

در نهایت برای اجرای قوانین معماری در سی شارپ شما باید یونیت تست های معماری را بنویسید تا بررسی کنید که آیا کد منبعی که نوشته اید با استانداردهای شما مطابقت دارد یا خیر؟ توجه داشته باشید که در این جا اصطلاح "استانداردها" یک موضوع کاملا نسبی است و ممکن است که این استانداردها توسط شما تعریف  شوند. متد تست که در ادامه آورده ایم تایید می کند که کلاس های سرویس شما دارای نامی با پسوند Service هستند.

[Fact]
public void ServiceClassesShouldHaveNameEndingWithService()
{
    var result = Types.InCurrentDomain()
                 .That().ResideInNamespace(("Core.Infrastructure.Services"))
                 .And().AreClasses()
                 .Should().HaveNameEndingWith("Service")
                 .GetResult();
    Assert.True(result.IsSuccessful);
}

در این جا شما می توانید قانون دیگری نیز داشته باشید که تایید می کند همه کلاس های سرویس شما اینترفیس IBaseService را پیاده سازی می کنند. متد تست زیر نشان می دهد که چگونه می توان به این امر دست پیدا کرد:

[Fact]
public void ServiceClassesShouldImplementIBaseServiceInterface()
{
   var result = Types.InCurrentDomain()
                .That().ResideInNamespace(("Core.Infrastructure.Services"))
                .And().AreClasses()
                .Should().ImplementInterface(typeof(IBaseService))
                .GetResult();
   Assert.True(result.IsSuccessful);
}

نکاتی مهم درباره نوشتن یونیت تست ها در سی شارپ

برای نوشتن یونیت تست ها در سی شارپ و دات نت 6 باید به چند نکته مهم دیگر نیز دقت داشته باشید. شما می توانید قانونی داشته باشید که تایید کند کلاس های سرویس public هستند. در صورتی که این کلاس ها به صورت sealed تنظیم شده باشند شما نمی توانید در آینده از آنها extend کنید.

[Fact]
public void ServiceClassesShouldBePublicAndNotSealed ()
{
    var result = Types.InCurrentDomain()
                .That().ResideInNamespace(("Core.Infrastructure.Services"))
                .Should().BePublic().And().NotBeSealed()
                .GetResult();
    Assert.True(result.IsSuccessful);
}

زمانی که شما این متدهای تست را اجرا می کنید متوجه خواهید شد که تمام آنها با موفقیت اجرا خواهند شد. سعی کنید این کد را تغییر دهید و دوباره تست هایی که نوشته اید را اجرا کنید.

نکات پایانی در خصوص اجرای قوانین معماری در زبان برنامه نویسی سی شارپ

به خاطر داشته باشید که در نسخه های جدیدتر زبان برنامه نویسی سی شارپ می توانید پیاده سازی پیش فرض اعضا را در یک اینترفیس داشته باشید. بنابراین اگر شما یک اینترفیس داشته باشید که توسط یک یا چند کلاس پیاده سازی شده باشد شما می توانید پیاده سازی پیش فرض از آن اینترفیس را بنویسید که کار را به میزان زیادی برای شما ساده تر می کند. علاوه بر این اگر در حال نوشتن کدی باشید که در تمام پیاده سازی های اینترفیس مشترک باشد باز هم می توانید از این قابلیت ها استفاده کرده و از مزایایی که به شما ارائه می دهند نهایت بهره را ببرید. 

 

برنامه نویسان

نویسنده 3346 مقاله در برنامه نویسان
  • C#.net
  • 357 بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید