65.9K
CodeProject 正在变化。 阅读更多。
Home

创建 N 层架构类的工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (17投票s)

2011 年 7 月 18 日

CPOL

8分钟阅读

viewsIcon

71008

downloadIcon

10961

此工具用于创建 N 层架构类。

引言

这是我的第九篇 C# 文章。这一次,我尝试了关于 C# 中 N 层架构的一个新概念。

什么是 N 层架构?

在开发应用程序时,这是一个非常重要的考虑主题。在决定应用程序的架构时,需要考虑许多因素,例如性能、可伸缩性和未来的开发问题。在决定使用哪种架构时,首先要确定您认为上述三个要素中最有价值的是什么——因为您所做的某些选择会影响其他要素。例如,一些提高性能的选择会影响设计的可伸缩性或未来发展等。

在这里,我们将一般性地讨论 n 层架构是什么,然后我们将探讨可用于开发 ASP.NET 应用程序的各种 n 层架构,以及与每种架构相关的性能、可伸缩性和未来开发问题。

首先,什么是 n 层架构?N 层架构是指具有至少 3 个“逻辑”层——或部分——分开的应用程序的架构。每一层只与直接下方的一层进行交互,并负责其特定的功能。

为什么要使用 n 层架构?因为每一层都可以位于物理上不同的服务器上,只需进行少量的代码更改,因此它们可以扩展并处理更多的服务器负载。此外,每一层内部的操作对其他层来说是完全隐藏的,这使得可以在不重新编译或修改其他层的情况下更改或更新一个层。

这是 n 层架构的一个非常强大的特性,因为可以在不重新部署整个应用程序的情况下添加附加功能或更改某个层。例如,通过将数据访问代码与业务逻辑代码分开,当数据库服务器更改时,您只需要更改数据访问代码。由于业务逻辑代码保持不变,因此业务逻辑代码无需修改或重新编译。

n 层应用程序通常有三个层,它们被称为表示层、业务层和数据层。让我们看看每个层负责什么。

表示层

表示层是负责显示用户界面并使用业务层类和对象“驱动”该界面的层。在 ASP.NET 中,它包括 ASPX 页面、用户控件、服务器控件,有时还包括与安全相关的类和对象。

业务层

业务层是负责访问数据层以从数据层检索、修改和删除数据,并将结果发送到表示层的层。此层还负责处理检索并发送到表示层的数据。

在 ASP.NET 中,它可能使用 SqlClientOleDb 对象来从 SQL Server 或 Access 数据库检索、更新和删除数据,还将检索到的数据以 DataReader DataSet 对象或自定义集合对象的形式传递给表示层。它也可能只发送一个整数,但该整数是通过数据层中的数据计算出来的,例如表中记录的数量。

BLL 和 DAL

通常,此层被划分为两个子层:业务逻辑层 (BLL) 和数据访问层 (DAL)。业务逻辑层位于数据访问层之上,这意味着 BLL 使用 DAL 类和对象。DAL 负责访问数据并将其转发给 BLL。

在 ASP.NET 中,它可能使用 SqlClient OleDb 来检索数据,并以 DataSet DataReader 的形式将其发送给 BLL。BLL 负责准备或处理检索到的数据,并将其发送到表示层。在 ASP.NET 中,它可能使用 DataSet DataReader 对象来填充自定义集合或处理它们以得出某个值,然后将其发送到表示层。BLL 有时仅作为透明层工作。例如,如果您想将 DataSet DataReader 对象直接传递给表示层。

数据层

数据层是数据库本身或数据源。在 .NET 中,它通常是 SQL Server 或 Access 数据库,但不仅限于此。它也可以是 Oracle、mySQL 甚至是 XML。在本文中,我们将重点关注 SQL Server,因为它已被证明是 .NET 应用程序中最快的数据库。

nlayertool/app_arch.gif

维基百科的定义!

三层 [3] 是一种客户端-服务器体系结构,其中用户界面、功能过程逻辑(“业务规则”)、计算机数据存储和数据访问作为独立模块进行开发和维护,通常在不同的平台上。

三层模型是软件架构和软件设计模式。

除了具有良好定义接口的模块化软件的通常优点外,三层架构旨在允许在需求或技术变化时独立地升级或替换这三个层中的任何一个。例如,表示层中操作系统更改只会影响用户界面代码。

通常,用户界面运行在台式机或工作站上,并使用标准的图形用户界面,功能过程逻辑可能由一个或多个独立模块组成,这些模块运行在工作站或应用程序服务器上,并且数据库服务器或大型机上的 RDBMS 包含计算机数据存储逻辑。中间层本身可能有多层(在这种情况下,整个架构称为“n 层架构”)。

三层架构具有以下三个层

表示层:这是应用程序的最高级别。表示层显示与浏览商品、购买和购物车内容等服务相关的信息。它通过将结果输出到浏览器/客户端层和网络中的所有其他层来与其他层进行通信。

应用程序层(业务逻辑、逻辑层、数据访问层或中间层):逻辑层从表示层中分离出来,并作为自己的层,通过执行详细处理来控制应用程序的功能。

数据层:此层包含数据库服务器。在这里存储和检索信息。此层使数据保持中立且独立于应用程序服务器或业务逻辑。为数据分配自己的层也有助于提高可伸缩性和性能。

基本要求

  • .NET Framework 3.5 及更高版本
  • SQL Server 2000 及更高版本

关于工具的描述

基本上,要创建 n 层架构的类,我们需要考虑表结构编写代码,并单独编写业务逻辑和数据访问层的代码。此外,如果数据库有更多的表,我们需要花费更多时间来为每个表创建类。

因此,为了简化这一点,我开发了这个工具。该工具创建数据对象类(我称之为“值对象”)、业务逻辑层类、数据访问层类。该工具创建了基本功能。如果我们想添加任何额外功能,可以通过在任何 IDE(当然是 Visual Studio)中打开它来单独编辑。

工具的组成部分

  1. Class Generator Controls:这是一个独立的 Windows 类库,其中包含连接到服务器所需的所有组件、服务器中的数据库列表、选定数据库中的表列表。创建类的位置、命名空间和类的名称。
  2. Class Generator Events:这也是一个独立的类库,用于处理 Class Generator Controls 中所有控件的事件。

创建的类是这样创建的,以便可以与 Linq 一起使用。

nlayertool/scr1.jpg

我分别创建了所有必需的类库,然后将它们集成到 Class Generator Windows 应用程序中。您可以通过下载解决方案来清晰地了解控件和事件。

Class Generator Controls

nlayertool/scr2.jpg

Class Generator Events

nlayertool/scr3.jpg

工具的工作流程

首先,我们需要提供数据库的登录凭据,包括服务器名称或 IP、用户名和密码,然后单击连接按钮。如果连接成功,它会弹出一个消息,告知连接成功。建立连接后,服务器中的数据库列表会绑定到数据库组合框。选定数据库的表列表会绑定到表列表组合框。此外,命名空间名称、类名会显示在相应的文本框中。

数据库名称被视为命名空间名称,并与层名称(BLL、DAL、VO)连接。表名就是类名。如果需要编辑,可以进行编辑。然后选择要创建文件的位置。然后选择类文件的语言,是 C# 还是 VB.NET。最后单击“生成类”按钮。单击后,会创建类,并在“类文件路径”框中显示创建类的完整路径。

一小段代码

public string CreateClassFiles()
{
	System.Text.StringBuilder resultBuilder = new System.Text.StringBuilder();
	resultBuilder.AppendLine(fileCreator.CreateVOClass());
	resultBuilder.AppendLine(fileCreator.CreateBLLClass());
	resultBuilder.AppendLine(fileCreator.CreateDALClass());
	resultBuilder.AppendLine("Files are created successfully.!");
	return resultBuilder.ToString();
}//Class Generate Button Click Event
private void btnClassGenerator_Click(object sender, EventArgs e)
{
	try
	{
		if (serverBox.IsValuesEmpty || locationBox.IsValuesEmpty 
				|| bllBox.IsValuesEmpty || dalBox.IsValuesEmpty 
				|| voBox.IsValuesEmpty)
			CommonFunctions.ShowMessageBox
				("Please enter all the required fields! ", 
				MessageBoxButtons.OK, MessageBoxIcon.Error);
		else
		{
			UIEntryStore uiEntryStore = new UIEntryStore();
			uiEntryStore.ServerInstance = serverBox.ServerInstance;
			uiEntryStore.ServerUsername = serverBox.ServerUsername;
			uiEntryStore.ServerPassword = serverBox.ServerPassword;
			uiEntryStore.DatabaseName = databaseBox.SelectedDatabase;
			uiEntryStore.TableName = databaseBox.SelectedTable;
			uiEntryStore.PrimaryKey = databaseBox.PrimaryKey;
			uiEntryStore.ColumnsInformation = 
				CommonFunctions.SqlServerEventHandler.
				GetTableColumns(databaseBox.SelectedDatabase, 
				databaseBox.SelectedTable);
			uiEntryStore.FileLocation = locationBox.FileLocation;
			uiEntryStore.VOClassName = voBox.ClassName;
			uiEntryStore.VONamespace = voBox.Namespace;
			uiEntryStore.VOParentDirectories = voBox.ParentDirectories;
			uiEntryStore.BLLClassName = bllBox.ClassName;
			uiEntryStore.BLLNamespace = bllBox.Namespace;
			uiEntryStore.BLLParentDirectories = 
						bllBox.ParentDirectories;
			uiEntryStore.DALClassName = dalBox.ClassName;
			uiEntryStore.DALNamespace = dalBox.Namespace;
			uiEntryStore.DALParentDirectories = 
						dalBox.ParentDirectories;
			uiEntryStore.ClassFileLanguage = 
				languageBox.IsCSSelected ? ClassLanguages.CSharp : 
				ClassLanguages.VisualBasic;
			ClassGeneratorButtonEvents buttonEvent = 
				new ClassGeneratorButtonEvents(this, uiEntryStore);
			this.classFilesInfoBox.DisplayText = 
				buttonEvent.CreateClassFiles();
		}
	}
	catch (Exception ex)
	{
		CommonFunctions.ShowMessageBox
			("Error occured while creating class files." + 
			Environment.NewLine + "Please debug the error: " + 
			ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
}

请在下载文件中查看完整的代码。

创建的类的用法。示例代码

//Selecting all the records.
ProductsBLL productsBLL = new ProductsBLL();
var products = productsBLL.SelectAll().OrderBy
		(p => p.ProductName);// Selecting a single record.
private Products GetProduct(int id)
{
     Products product = productsBLL.SelectAll().Find(p => p.ProductID == id);
     return product;
}

历史

版本 2.0 - https://codeproject.org.cn/Articles/1104994/A-Tool-to-create-N-Layer-Architecture-Classes-v

结论

感谢您阅读本文。我期待您的反馈。您还可以期待我更多精彩内容。

© . All rights reserved.