[Professional ASP.NET Design Pattern 读书笔记系列] 04 业务逻辑层:业务逻辑层的组织
1. 业务逻辑层包含那四种模式?
包含Transaction Script事务脚本,Active Record活动记录模式,Anemic Model缺血性模型,Domain Model领域模型
2. 什么是Transaction Script?
Transactoin Script是一种面向过程而不是面向对象的模式,把它业务逻辑层要完成的功能分成一个一个的Procedure,每个Procedure包含了工作流,业务规则,验证规则以及数据库的持久化等。如下图:
可见业务逻辑层是一个一个的静态方法构成的,三个静态方法分别完成了“计算待入库的订单的价值”、”产生信使订单“、和“通知客户订单延期”。这样当上一层需要完成相应的功能是,业务逻辑层直接调用相关的静态方法即可完成。
下面的代码是一个典型的Transaction Script:
namespace ASPPatterns.Chap4.TransactionScript.BLL
{
public class HolidayService
{
private static string connectionString = ConfigurationManager.ConnectionStrings["HR"].ConnectionString;
public static bool BookHolidayFor(int employeeId, DateTime From, DateTime To)
{
bool booked = false;
TimeSpan numberOfDaysRequestedForHoliday = To - From;if (numberOfDaysRequestedForHoliday.Days > 0)
{
if (RequestHolidayDoesNotClashWithExistingHoliday(employeeId, From, To))
{
int holidayAvailable = GetHolidayRemainingFor(employeeId);
if (holidayAvailable >= numberOfDaysRequestedForHoliday.Days)
{
SumitHolidayBookingFor(employeeId, From, To);
booked = true;
}
}
}return booked;
}
private static int GetHolidayRemainingFor(int employeeId)
{
}
public static List<EmployeeDTO> GetAllEmployeesOnLeaveBetween(DateTime From, DateTime To)
{
}public static List<EmployeeDTO> GetAllEmployeesWithHolidayRemaing()
{
}private static bool RequestHolidayDoesNotClashWithExistingHoliday(int employeeId, DateTime From, DateTime To)
{
}
// Data Access methodsprivate static void SumitHolidayBookingFor(int employeeId, DateTime From, DateTime To)
{
}public static List<BookedLeaveDTO> GetBookedLeaveFor(int employeeId)
{
}private static int GetHolidayEntitlementFor(int employeeId)
{
string selectSql = "SELECT HolidayEntitlement FROM Employees WHERE Id = @EmployeeId;";int holidayEntitlement = 0;
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlCommand command = connection.CreateCommand();
command.CommandText = selectSql;command.Parameters.Add(new SqlParameter("@EmployeeId", employeeId));
connection.Open();
holidayEntitlement = int.Parse(command.ExecuteScalar().ToString());
}return holidayEntitlement;
}
}
}
可见业务逻辑层全部由静态方法构成,其中提供给上层使用的方法都是public,只在其他public方法内部使用的方法全部是private。
3. ActiveRecord 模式是怎么样的?
ActiveRecord模式就是数据库的字段的设计与业务逻辑层所需要的Model非常近似,因此采用Class到Table的映射。一个Class代表一个Table。
假设有一个Blog网站,数据库Blog有两张表Post和Comment:
在其Business Logic Layer就设计两个类,一个Post类,一个Comment类。
4. DomainModel是怎么样的?
对要做的业务进行抽象,找到其中的实体定义为类A,行为定义为类B,并且类B为类A的子类,这样现实中每次所做的事情的对象和操作,都以数据的形式存放在类A的实例中,既不涉及上一层对类A和B的操作,也不涉及下一层如何操作数据库。这样Domain Model的上一层只关心如何生成A的实例,Domain model的下一层只关心传过去的A的实例如何存储。
5. Anemic DomainModel是怎么样的?
Anemic的DomainModel实际上是把Business Logic Layer里面很多规则,比如操作在逻辑上是否正确等,在Domain Model里去除了,也就是说所建立的对象和行为的模型,都只有property,而没有method。


浙公网安备 33010602011771号