多层企业应用程序架构






3.21/5 (30投票s)
多层企业应用程序架构
引言
多层架构,通常被称为“N”层架构,是一种被划分为称为层或块的独立部分的软件系统。默认情况下,“N”的值假定为三。
在阅读了上述几句话后,一个人最先提出的问题是:“我为什么需要这些层,它们解决了什么问题?”
软件应用程序出于多种原因采用这种方法构建。最主要的是能够为系统提供最佳的“可伸缩性”,并允许独立地升级、替换或交换任何一层。
在软件系统的某个阶段,不可避免会出现“变更”。这种变更可能以功能变更、功能增强、全新模块,甚至硬件基础设施增强等形式出现。在任何情况下,变更都可能发生在初始开发过程中,或者在第一个版本完成后发生。因此,从一开始就必须将系统的架构设计为“多层”。这将有助于我们在实施任何一层变更时,将对系统的影响降至最低。
由于源代码被组织成多个层,因此调试和维护整个应用程序将更加容易。这种组织方式将使您(开发者)或与您合作的其他开发者能够轻松地定位发生异常或需要实施变更的具体部分。
如果系统没有实现良好的结构化架构,您的应用程序将容易出现缺陷和错误;这也会使任何类型的升级或增强的执行变得困难且耗时。系统将不具备很高的可伸缩性,这将导致应用程序性能不佳。
典型的多层应用程序包括:
- 表示层(这仅仅是我们的网站应用程序)
- 业务逻辑层(我们应用程序的“大脑”)
- 数据访问层(我们应用程序的数据处理部分)
现在有一个快速的问题。“所有这些层都只存在于一台机器上吗?”是和否!困惑了吗?这就是它的工作原理!
在多层架构中,所有层都像上面提到的三层一样存在。这完全取决于这些层是全部位于一台机器上,还是分布在网络上的多台机器上。
假设我们需要让 Web 服务器运行,将数据存储在数据库中,并且 Web 应用程序也运行在同一台服务器上(低预算项目:))。那么这也将被称为一个 3 层应用程序。
详细描述
请参考下面的图片作为即将进行的描述的参考

总体解决方案结构

表示层
这是表示逻辑层。这是用户将看到的内容。它包括简单的控件和用户输入验证。这个应用程序也称为瘦客户端。它类似于我们的 Web 应用程序。它引用了我们的业务层。这一层对系统工作、数据库或任何信息一无所知。
示例
下面的页面是 aspx 页面的代码隐藏文件。在以下句子中,仅引用了业务层。
using XOR.Development.Ecommerce.XORBusinessObjects;
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using XOR.Development.Ecommerce.XORBusinessObjects;
namespace XOR.Development.Ecommerce.WebApp
{
public partial class Search : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnUserRegister_Click(object sender, EventArgs e)
{
}
}
}
业务逻辑层
这是我们整个应用程序的“大脑”。它提供了业务流程逻辑和数据访问。体系结构的业务逻辑层将充当表示层到数据访问层的桥梁,以便在某些情况下处理信息,而在其他情况下,它还可以作为通道,以确保信息的顺畅流动。这一层将拥有关于活动和需要进行的处理的大量信息。这一层将大量实现业务对象。
这一层不知道任何访问数据的信息。事实上,它不知道如何检索信息。它只是将需求传达给数据访问层。这一层根据先前收集的需求来制定业务规则。查看下图中的引用以获得清晰的理解。
解决方案中的示例业务层项目

示例
下面的示例是接受来自表示层数据的类文件。这一层引用了通用对象、数据访问层、业务接口库。
此处应用程序示例使用了数据访问层中的“ProcessSelectProducts
”类文件。它将信息发送到文件(ProcessSelectProducts
),该文件从数据库获取数据。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using XOR.Development.Ecommerce.XORBusinessInterface;
using XOR.Development.Ecommerce.XORCommonObjects;
using Microsoft.ApplicationBlocks.Data;
using Microsoft.ApplicationBlocks.Data.Select;
namespace XOR.Development.Ecommerce.XORBusinessObjects
{
public class ProcessGetProducts : IXORBusinessLogic
{
public ProcessGetProducts()
{
}
private string _searchcriteria;
public string SearchCriteria
{
get { return _searchcriteria; }
set { _searchcriteria = value; }
}
private DataSet _resultset;
public DataSet ResultSet
{
get { return _resultset; }
set { _resultset = value; }
}
#region IXORBusinessLogic Members
public void Invoke()
{
ProcessSelectProducts oProcessSelectProducts = new ProcessSelectProducts();
ResultSet = oProcessSelectProducts.Get(SearchCriteria);
}
#endregion
}
}
数据访问层
这是我们应用程序中唯一了解如何与数据库服务器交互并检索所需信息的层。它不知道谁在询问,也不知道它将信息提供给谁。它只知道它需要将信息返回给请求对象。
数据检索过程很可能以选择、查询、插入、更新或删除数据库中的信息的形式进行。其他处理包括利用可扩展标记语言 (XML) 数据,但这最终取决于您的具体系统及其业务需求。
示例
请看下面的例子。
数据访问层中的这个类文件用于对
数据库表执行“Select
”操作。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using XOR.Development.Ecommerce.XORCommonObjects;
namespace Microsoft.ApplicationBlocks.Data.Select
{
public class ProcessSelectProducts : XORDataAccessBase
{
public ProcessSelectProducts()
{
//TODO Constructor
StoredProcedureName = XORStoredProcedures.Name.USP_SearchAllProducts.ToString();
}
public DataSet Get(string SearchCriteria)
{
DataSet ds;
ProductSelectSearchDataParameters oProductSelectSearchDataParameters =
new ProductSelectSearchDataParameters(SearchCriteria);
XORDataBaseHelper dbhelper = new XORDataBaseHelper( StoredProcedureName );
ds = dbhelper.Run
(ConnectionString,oProductSelectSearchDataParameters.Parameters);
return ds;
}
}
public class ProductSelectSearchDataParameters
{
private string _searchcriteria;
private SqlParameter[] _parameters;
public string SearchCriteria
{
get { return _searchcriteria; }
set { _searchcriteria = value; }
}
public SqlParameter[] Parameters
{
get { return _parameters; }
set { _parameters = value; }
}
public ProductSelectSearchDataParameters(string searchcriteria)
{
SearchCriteria = searchcriteria;
Build();
}
private void Build()
{
SqlParameter[] parameters =
{ new SqlParameter("@UserSearchText", SearchCriteria) };
Parameters = parameters;
}
}
}
业务/通用对象
这是包含所有实体的层,例如信用卡实体、地址实体、最终用户实体等等。业务/通用对象还将直接映射您之前创建的数据库表与代码中的类。这并不一定意味着每个通用/业务对象都将是数据库中的表。许多是,但有时我们需要一个信息容器,这些信息需要传递到整个应用程序。这将以通用对象的形式出现。
示例业务/通用对象

示例
请看下面的例子。这是一个描述订单详细信息的类文件。
它包含了订单处理中所有必需的字段。
using System;
using System.Collections.Generic;
using System.Text;
namespace XOR.Development.Ecommerce.XORCommonObjects
{
public class OrderDetailsEntity
{
public OrderDetailsEntity()
{
//TODO Constructor
}
private int _orderDetailsIdField;
private int _orderIdField;
private int _productIdField;
private string _productField;
private int _quantityField;
public int OrderDetailsId
{
get
{
return _orderDetailsIdField;
}
set
{
_orderDetailsIdField = value;
}
}
public int OrderId
{
get
{
return _orderIdField;
}
set
{
_orderIdField = value;
}
}
public int ProductId
{
get
{
return _productIdField;
}
set
{
_productIdField = value;
}
}
public string ProductField
{
get
{
return _productField;
}
set
{
_productField = value;
}
}
public int Quantity
{
get
{
return _quantityField;
}
set
{
_quantityField = value;
}
}
}
}
结论
至此,多层应用程序架构介绍完毕。希望本文能让您了解将应用程序拆分为多层的好处。祝您好运!!
历史
- 2009年1月19日:初次发布