偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

譯者 | 李睿

審校 | 梁策 孫淑娟

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

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

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

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

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

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

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

開發(fā)人員可以在單元測試方法中使用NArchTest,然后將這些測試方法合并到構建和發(fā)布管道中,以便在每次簽入時自動驗證架構規(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ā)人員的偏好,選擇“將解決方案和項目放在同一目錄”復選框。 (7)單擊下一步。 (8)在接下來顯示的“附加信息”窗口中,從頂部的下拉列表中選擇.NET 6.0作為目標框架。將“身份驗證類型”保留為“無”(默認)。 (9)確保未選中“啟用Docker”、“為HTTPS配置”和“啟用開放API支持”復選框,因為不會在此處使用這些功能。 (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)建模型類

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

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

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

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

在同一個項目中創(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中編寫架構單元測試

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

以下測試方法驗證服務類的名稱是否帶有服務后綴。

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

可以使用另一條規(guī)則來驗證所有服務類是否都實現(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ī)則來驗證服務類是公共的而不是密封的。如果這些類是密封的,將無法進一步擴展它們。

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

當運行這些測試方法時,應該會發(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

?

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

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ù)

2009-09-02 17:10:45

C#語言入門

2011-03-30 11:01:13

C語言隨機

2021-03-07 16:37:52

C#應用程序

2021-02-01 12:36:59

C# Channels存儲

2009-08-18 11:17:37

C#添加鼠標右鍵

2016-02-22 15:02:57

GoRedis連接池

2009-08-13 17:04:09

C#語言C#程序

2010-01-15 19:17:48

C++語言

2011-05-13 17:25:34

C

2022-01-06 14:25:24

C語言指針內存

2009-08-19 16:50:32

Visual C#C#語言特性

2023-10-27 11:21:20

C語言Multics語言

2023-12-21 11:46:48

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

2009-06-30 10:46:05

多級指針

2010-08-24 16:00:43

C語言

2021-12-06 11:19:47

語言指針內存
點贊
收藏

51CTO技術棧公眾號