成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

譯者 | 李睿

審校 | 梁策 孫淑娟

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

還可以利用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ì)量。對于初學者來說,SonarQube和NDepend是兩個流行的工具。靜態(tài)代碼分析也可作為Visual Studio的一部分。

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

雖然靜態(tài)代碼分析工具可以幫助開發(fā)人員驗證或強制執(zhí)行通用最佳實踐,但可以利用NArchTest創(chuàng)建單元測試,以在其.NET、.NET Core和.NET 6應用程序中強制執(zhí)行架構(gòu)規(guī)則。這些包括代碼庫中的類設計、命名和依賴關(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ā)人員的偏好,選擇“將解決方案和項目放在同一目錄”復選框。 (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中編寫架構(gòu)單元測試

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

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

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技術(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ù)

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#程序

2022-09-20 12:53:15

編程語言漏洞

2009-08-14 00:07:03

C#編譯

2021-01-19 05:30:55

C# 8異步流IEnumerable

2021-01-18 05:18:18

C# 8模式C# 7

2010-01-15 19:17:48

C++語言

2011-05-13 17:25:34

C

2022-01-06 14:25:24

C語言指針內(nèi)存

2009-08-19 16:50:32

Visual C#C#語言特性

2023-10-27 11:21:20

C語言Multics語言
點贊
收藏

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

主站蜘蛛池模板: 国产福利在线播放 | 欧美黄色性生活视频 | 亚洲日韩欧美一区二区在线 | 中文字幕一区二区三区乱码在线 | www.国产精品 | 久久午夜国产精品www忘忧草 | 亚洲毛片在线观看 | 成人精品一区二区户外勾搭野战 | 久草免费在线视频 | 超碰伊人久久 | 欧美精品一区二区三区视频 | 国产精品久久久久久久午夜片 | 夜夜爽99久久国产综合精品女不卡 | 精品国产1区2区3区 在线国产视频 | 久久久网 | 五月天国产 | 国产毛片久久久 | 国产福利在线小视频 | 国精产品一品二品国精在线观看 | 91欧美激情一区二区三区成人 | 中文字幕乱码一区二区三区 | 中文字幕在线播放第一页 | 日韩在线一区二区 | 久国久产久精永久网页 | 波多野结衣精品在线 | a亚洲精品 | 人人射人人草 | 亚洲成年人免费网站 | 午夜专区 | 91免费福利视频 | 久久精品国产亚洲一区二区 | 91亚洲欧美 | 一区二区三区四区av | 国产欧美一区二区三区在线看 | 91精品一区二区三区久久久久久 | 欧美一区二区三区在线 | 一级a性色生活片久久毛片 午夜精品在线观看 | 黑人巨大精品欧美一区二区免费 | 日本一本视频 | 人人看人人搞 | 日本三级做a全过程在线观看 |