自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在C#語言中實施架構(gòu)規(guī)則

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

譯者 | 李睿

審校 | 梁策 孫淑娟

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(1)啟動Visual Studio 2022 IDE。

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

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

(4)單擊下一步。

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

(6)單擊下一步。

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

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

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

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

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

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

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

再創(chuàng)建兩個名為Product和Customer的模型類。這兩個類中的每一個都應(yīng)該擴展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ù)類

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

public interface IBaseService
{
public void Initialize();
}

Initialize方法必須由實現(xiàn)此接口的所有類實現(xiàn)。Product Service和Customer Service類實現(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<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>();
}
}
}

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

6.安裝NetArchTest.RulesNuGet包

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

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

PM> Install-Package NetArchTest.Rules

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

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

以下測試方法驗證服務(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ī)則來驗證所有服務(wù)類是否都實現(xiàn)了IBaseService接口。以下測試方法說明了如何實現(xiàn)這一點。

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

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

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

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

正在運行NetArchTest單元測試

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

原文鏈接:https://www.infoworld.com/article/3656703/how-to-enforce-architecture-rules-in-csharp.html

?

責(zé)任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2010-03-11 19:16:32

Python語言

2023-07-18 12:50:48

C 語言用戶輸入

2011-06-28 09:29:11

C#修飾符

2020-12-31 07:31:10

C# 反射數(shù)據(jù)

2021-03-07 16:37:52

C#應(yīng)用程序

2009-09-02 17:10:45

C#語言入門

2011-03-30 11:01:13

C語言隨機

2016-02-22 15:02:57

GoRedis連接池

2021-02-01 12:36:59

C# Channels存儲

2009-08-18 11:17:37

C#添加鼠標右鍵

2009-08-13 17:04:09

C#語言C#程序

2021-01-18 05:18:18

C# 8模式C# 7

2009-08-14 00:07:03

C#編譯

2021-01-19 05:30:55

C# 8異步流IEnumerable

2022-09-20 12:53:15

編程語言漏洞

2023-12-21 11:46:48

C語言柔性數(shù)組開發(fā)

2009-06-30 10:46:05

多級指針

2021-12-06 11:19:47

語言指針內(nèi)存

2023-10-27 11:21:20

C語言Multics語言

2010-08-24 16:00:43

C語言
點贊
收藏

51CTO技術(shù)棧公眾號