日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何在C#語言中實(shí)施架構(gòu)規(guī)則

譯者 | 李睿

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)黔西南州,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

審校 | 梁策 孫淑娟

開發(fā)人員為了確保他們編寫的代碼達(dá)到預(yù)期的目的,需要進(jìn)行單元測(cè)試。有一些開源框架可用于對(duì).NET應(yīng)用程序進(jìn)行單元測(cè)試,即NUnit和xUnit.Net。開發(fā)人員應(yīng)該始終在軟件開發(fā)工作流程中加入單元測(cè)試,以減少或消除應(yīng)用程序中的錯(cuò)誤。

還可以利用ArchUnit或NetArchTest等框架來編寫有助于實(shí)施架構(gòu)規(guī)則的單元測(cè)試。受基于Java的ArchUnit啟發(fā),Ben Morris開發(fā)的NetArchTest是一個(gè)簡(jiǎn)單的框架,可用于在.NET Framework或.NET Core以及.NET6項(xiàng)目中實(shí)施架構(gòu)規(guī)則。

本文討論了在C#語言中執(zhí)行架構(gòu)規(guī)則的重要性以及如何利用NetArchTest來實(shí)現(xiàn)這一點(diǎn)。要使用本文中提供的代碼示例,需要在系統(tǒng)中安裝Visual Studio 2022。

1.強(qiáng)制執(zhí)行架構(gòu)規(guī)則的必要性

有大量靜態(tài)代碼分析框架和工具可用于檢查.NET、.NET Core或.NET 6中的代碼質(zhì)量。對(duì)于初學(xué)者來說,SonarQube和NDepend是兩個(gè)流行的工具。靜態(tài)代碼分析也可作為Visual Studio的一部分。

然而,這些工具很少能幫助開發(fā)人員在源代碼中保留架構(gòu)設(shè)計(jì)模式或強(qiáng)制執(zhí)行架構(gòu)規(guī)則。如果不定期驗(yàn)證或執(zhí)行這些規(guī)則,其應(yīng)用程序的設(shè)計(jì)或架構(gòu)將隨著時(shí)間的推移而退化。最終會(huì)發(fā)現(xiàn)維護(hù)代碼庫已成為一項(xiàng)艱巨的任務(wù)。

雖然靜態(tài)代碼分析工具可以幫助開發(fā)人員驗(yàn)證或強(qiáng)制執(zhí)行通用最佳實(shí)踐,但可以利用NArchTest創(chuàng)建單元測(cè)試,以在其.NET、.NET Core和.NET 6應(yīng)用程序中強(qiáng)制執(zhí)行架構(gòu)規(guī)則。這些包括代碼庫中的類設(shè)計(jì)、命名和依賴關(guān)系的約定。

開發(fā)人員可以在單元測(cè)試方法中使用NArchTest,然后將這些測(cè)試方法合并到構(gòu)建和發(fā)布管道中,以便在每次簽入時(shí)自動(dòng)驗(yàn)證架構(gòu)規(guī)則。

2.在Visual Studio2022中創(chuàng)建單元測(cè)試項(xiàng)目

首先,使用xUnit測(cè)試項(xiàng)目模板在Visual Studio 2022中創(chuàng)建單元測(cè)試項(xiàng)目。以下步驟將在Visual Studio 2022中創(chuàng)建一個(gè)新的單元測(cè)試項(xiàng)目:

(1)啟動(dòng)Visual Studio 2022 IDE。 (2)點(diǎn)擊“創(chuàng)建新項(xiàng)目”。 (3)在“創(chuàng)建新項(xiàng)目”窗口中,從顯示的模板列表中選擇“xUnit測(cè)試項(xiàng)目”。 (4)單擊下一步。 (5)在“配置新項(xiàng)目”窗口中,指定新項(xiàng)目的名稱和位置。 (6)根據(jù)開發(fā)人員的偏好,選擇“將解決方案和項(xiàng)目放在同一目錄”復(fù)選框。 (7)單擊下一步。 (8)在接下來顯示的“附加信息”窗口中,從頂部的下拉列表中選擇.NET 6.0作為目標(biāo)框架。將“身份驗(yàn)證類型”保留為“無”(默認(rèn))。 (9)確保未選中“啟用Docker”、“為HTTPS配置”和“啟用開放API支持”復(fù)選框,因?yàn)椴粫?huì)在此處使用這些功能。 (10)單擊創(chuàng)建。

這將在Visual Studio 2022中創(chuàng)建一個(gè)新的xUnit項(xiàng)目。將在本文的后續(xù)部分中使用該項(xiàng)目。

3.在Visual Studio2022中創(chuàng)建類庫項(xiàng)目

現(xiàn)在在Visual Studio 2022中創(chuàng)建一個(gè)類庫項(xiàng)目。按照以下步驟將在Visual Studio 2022中創(chuàng)建一個(gè)新的類庫項(xiàng)目:

(1)啟動(dòng)Visual Studio 2022 IDE。

(2)點(diǎn)擊“創(chuàng)建新項(xiàng)目”。

(3)在“創(chuàng)建新項(xiàng)目”窗口中,從顯示的模板列表中選擇“類庫”。

(4)單擊下一步。

(5)在“配置新項(xiàng)目”窗口中,指定新項(xiàng)目的名稱和位置。

(6)單擊下一步。

(7)在接下來顯示的“附加信息”窗口中,從頂部的下拉列表中選擇.NET 6.0作為目標(biāo)框架。

(8)單擊創(chuàng)建。

這將在Visual Studio 2022中創(chuàng)建一個(gè)新的類庫項(xiàng)目。將在本文的后續(xù)部分中使用該項(xiàng)目。

4.在.NET 6中創(chuàng)建模型類

假設(shè)類庫項(xiàng)目的名稱是Core.Infrastructure。在解決方案資源管理器窗口中,選擇此項(xiàng)目,然后單擊“添加->新建文件夾”以將新的解決方案文件夾添加到項(xiàng)目中。模型應(yīng)與其解決方案文件夾同名。

現(xiàn)在在Models解決方案文件夾中創(chuàng)建一個(gè)名為BaseModel的類并插入以下代碼:

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

再創(chuàng)建兩個(gè)名為Product和Customer的模型類。這兩個(gè)類中的每一個(gè)都應(yīng)該擴(kuò)展BaseModel類,如下所示:

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; }
}

5.在.NET 6中創(chuàng)建服務(wù)類

在同一個(gè)項(xiàng)目中創(chuàng)建另一個(gè)解決方案文件夾,并將其命名為Services。在此解決方案文件夾中創(chuàng)建一個(gè)名為IBaseService的接口,并為其提供以下代碼:

public interface IBaseService
{
public void Initialize();
}

Initialize方法必須由實(shí)現(xiàn)此接口的所有類實(shí)現(xiàn)。Product Service和Customer Service類實(shí)現(xiàn)了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 GetProducts()
{
return new List();
}
}
}
//CustomerService.cs
using Core.Infrastructure.Models;
namespace Core.Infrastructure.Services
{
public sealed class CustomerService: IBaseService
{
public void Initialize()
{
//Write your implementation here
}
public List GetCustomers()
{
return new List();
}
}
}

需要注意的是,出于這個(gè)簡(jiǎn)單實(shí)現(xiàn)的目的,ProductService類和CustomerService類的Initialize方法都保留為空。開發(fā)人員可以為這些編寫自己的實(shí)現(xiàn)。

6.安裝NetArchTest.RulesNuGet包

現(xiàn)在將NetArchTest.RulesNuGet包添加到項(xiàng)目中。為此,需要在解決方案資源管理器窗口中選擇項(xiàng)目,然后右鍵單擊并選擇“管理NuGet包”。在NuGet包管理器窗口中,搜索NetArchTest.Rules包并安裝它。

或者,可以通過NuGet包管理器控制臺(tái)輸入下面顯示的行來安裝包。

PM> Install-Package NetArchTest.Rules

7.在.NET6中編寫架構(gòu)單元測(cè)試

最后,應(yīng)該編寫架構(gòu)單元測(cè)試來檢查被測(cè)源代碼是否符合標(biāo)準(zhǔn)。需要注意,此處的“標(biāo)準(zhǔn)”一詞是相對(duì)的,可以假設(shè)這些標(biāo)準(zhǔn)將由您定義。

以下測(cè)試方法驗(yàn)證服務(wù)類的名稱是否帶有服務(wù)后綴。

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

可以使用另一條規(guī)則來驗(yàn)證所有服務(wù)類是否都實(shí)現(xiàn)了IBaseService接口。以下測(cè)試方法說明了如何實(shí)現(xiàn)這一點(diǎn)。

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

還可以有一個(gè)規(guī)則來驗(yàn)證服務(wù)類是公共的而不是密封的。如果這些類是密封的,將無法進(jìn)一步擴(kuò)展它們。

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

當(dāng)運(yùn)行這些測(cè)試方法時(shí),應(yīng)該會(huì)發(fā)現(xiàn)它們都通過了測(cè)試,也就是取得了成功。嘗試更改代碼并重新運(yùn)行測(cè)試,以檢查是否符合討論的規(guī)則。

正在運(yùn)行NetArchTest單元測(cè)試

需要記住的是,在較新版本的C#語言中,可以在接口中擁有成員的默認(rèn)實(shí)現(xiàn)。因此,如果有一個(gè)接口由一個(gè)或多個(gè)類實(shí)現(xiàn),可以在接口中編寫默認(rèn)實(shí)現(xiàn)。如果編寫的代碼在接口的所有實(shí)現(xiàn)中都是通用的,就是正確的。


網(wǎng)頁標(biāo)題:如何在C#語言中實(shí)施架構(gòu)規(guī)則
當(dāng)前路徑:http://www.5511xx.com/article/cccjijh.html