当前位置: 首页 > 科技观察

如何在C#语言中实现架构规则_1

时间:2023-03-14 17:59:28 科技观察

译者|李睿评论|有一些开源框架可用于单元测试.NET应用程序,即NUnit和xUnit.Net。开发人员应始终在软件开发工作流程中包括单元测试,以减少或消除应用程序中的错误。还可以利用ArchUnit或NetArchTest等框架来编写有助于执行架构规则的单元测试。受基于Java的ArchUnit的启发,BenMorris的NetArchTest是一个简单的框架,可用于在.NETFramework或.NETCore以及.NET6项目中实施架构规则。本文讨论了在C#语言中强制执行体系结构规则的重要性,以及如何使用NetArchTest来实现这一点。要使用本文提供的代码示例,您需要在系统中安装VisualStudio2022。1.执行架构规则的需要有大量静态代码分析框架和工具可用于检查.NET、.NETCore或.NET6代码质量。对于初学者来说,SonarQube和NDepend是两个流行的工具。静态代码分析也作为VisualStudio的一部分提供。然而,这些工具很少能帮助开发人员保留架构设计模式或在源代码中强制执行架构规则。如果不定期验证或执行这些规则,其应用程序的设计或架构将随着时间的推移而退化。最终证明,维护代码库已成为一项艰巨的任务。虽然静态代码分析工具可以帮助开发人员验证或实施常见的最佳实践,但可以利用NArchTest创建单元测试以在其.NET、.NETCore和.NET6应用程序中实施架构规则。这些包括代码库中类设计、命名和依赖项的约定。开发人员可以在单元测试方法中使用NArchTest,然后将这些测试方法合并到构建和发布管道中,以在每次签入时自动验证模式规则。2.在VisualStudio2022中创建一个单元测试项目首先,使用xUnit测试项目模板在VisualStudio2022中创建一个单元测试项目。以下步骤将在VisualStudio2022中创建一个新的单元测试项目:(1)启动VisualStudio2022集成开发环境。(2)点击“创建新项目”。(3)在“CreateNewProject”窗口中,从显示的模板列表中选择“xUnitTestProject”。(4)单击下一步。(5)在“配置新项目”窗口中,指定新项目的名称和位置。(6)根据开发者的喜好,勾选“将解决方案和项目放在同一目录下”复选框。(7)单击下一步。(8)在接下来显示的“附加信息”窗口中,从顶部的下拉列表中选择.NET6.0作为目标框架。将“身份验证类型”保留为“无”(默认)。(9)确保取消选中“EnableDocker”、“ConfigureforHTTPS”和“EnableOpenAPISupport”复选框,因为这里不会使用这些功能。(10)点击创建。这将在VisualStudio2022中创建一个新的xUnit项目。本文的其余部分将使用该项目。3.在VisualStudio2022中创建一个类库项目现在在VisualStudio2022中创建一个类库项目。按照以下步骤在VisualStudio2022中创建一个新的类库项目:(1)启动VisualStudio2022IDE。(2)点击“创建新项目”。(3)在“CreateNewProject”窗口中,从显示的模板列表中选择“ClassLibrary”。(4)单击下一步。(5)在“配置新项目”窗口中,指定新项目的名称和位置。(6)单击下一步。(7)在接下来显示的“附加信息”窗口中,从顶部的下拉列表中选择.NET6.0作为目标框架。(8)点击创建。这将在VisualStudio2022中创建一个新的类库项目。本文的其余部分将使用该项目。4.在.NET6中创建模型类假设类库项目的名称是Core.Infrastructure。在SolutionExplorer窗口中,选择该项目并单击Add->NewFolder为项目添加一个新的解决方案文件夹。模型应与其解决方案文件夹同名。现在在Models解决方案文件夹中创建一个名为BaseModel的类并插入以下代码:publicabstractclassBaseModel{publicintId{get;放;}}再创建两个名为Product和Customer的模型类。这两个类中的每一个都应该扩展BaseModel类,如下所示:publicclassProduct:BaseModel{publicstringName{get;放;}publicdecimalPrice{get;放;}}publicclassCustomer:BaseModel{publicstringFirstName{get;放;}publicstringLastName{get;放;}}5.在.NET中创建一个服务类6在同一项目中创建另一个解决方案文件夹并将其命名为Services。在此解决方案文件夹中创建一个名为IBaseService的接口,并为其提供以下代码:publicinterfaceIBaseService{publicvoidInitialize();所有实现此接口的类都必须实现Initialize方法。ProductService和CustomerService类实现了IBaseService接口,如下面的代码片段所示:{//在这里写你的实现}publicListGetProducts(){returnnewList();}}}//CustomerService.csusingCore.Infrastructure.Models;namespaceCore.Infrastructure.Services{publicsealedclassCustomerService:IBaseService{publicvoidInitialize(){//在这里写你的实现}publicListGetCustomers(){返回新列表<客户>();请注意,出于此简单实现的目的,ProductService类和CustomerService类的Initialize方法均留空。开发人员可以为这些编写自己的实现。6.安装NetArchTest.RulesNuGet包现在将NetArchTest.RulesNuGet包添加到项目中。为此,请在“解决方案资源管理器”窗口中选择项目,然后右键单击并选择“管理NuGet包”。在NuGet包管理器窗口中,搜索NetArchTest.Rules包并安装它。或者,可以通过NuGet包管理器控制台输入如下所示的行来安装包。PM>Install-PackageNetArchTest.Rules7.在.NET6中编写体系结构单元测试最后,应编写体系结构单元测试以检查被测源代码是否符合标准。请注意,这里的“标准”一词是相对的,可以假定这些标准将由您定义。以下测试方法验证服务类的名称是否以服务为后缀。publicvoidServiceClassesShouldHaveNameEndingWithService(){varresult=Types.InCurrentDomain().That().ResideInNamespace(("Core.Infrastructure.Services")).And().AreClasses().Should().HaveNameEndingWith("Service").GetResult();Assert.True(result.IsSuccessful);}另一个规则可用于验证所有服务类是否实现IBaseService接口。下面的测试方法说明了这是如何实现的。publicvoidServiceClassesShouldImplementIBaseServiceInterface(){varresult=Types.InCurrentDomain().That().ResideInNamespace(("Core.Infrastructure.Services")).And().AreClasses().Should().ImplementInterface(typeof(IBaseService)).GetResult();Assert.True(result.IsSuccessful);}也可以有一条规则来验证服务类是公共的而不是密封的。如果这些类是密封的,就不可能进一步扩展它们。publicvoidServiceClassesShouldBePublicAndNotSealed(){varresult=Types.InCurrentDomain().That().ResideInNamespace(("Core.Infrastructure.Services")).Should().BePublic().And().NotBeSealed().GetResult();Assert.True(result.IsSuccessful);}当你运行这些测试方法时,你应该会发现它们都通过了测试,即成功。尝试更改代码并重新运行测试以检查是否遵循了所讨论的规则。运行NetArchTest单元测试时要记住的一点是,在较新版本的C#语言中,可以在接口中具有成员的默认实现。所以,如果你有一个由一个或多个类实现的接口,你可以在接口中编写一个默认实现。如果代码被编写为在接口的所有实现中通用,则代码是正确的。原文链接:https://www.infoworld.com/article/3656703/how-to-enforce-architecture-rules-in-csharp.html