[Professional ASP.NET Design Pattern 读书笔记系列] 04 业务逻辑层:业务逻辑层的组织

1. 业务逻辑层包含那四种模式?

包含Transaction Script事务脚本,Active Record活动记录模式,Anemic Model缺血性模型,Domain Model领域模型

2. 什么是Transaction Script?

Transactoin Script是一种面向过程而不是面向对象的模式,把它业务逻辑层要完成的功能分成一个一个的Procedure,每个Procedure包含了工作流,业务规则,验证规则以及数据库的持久化等。如下图:

image

可见业务逻辑层是一个一个的静态方法构成的,三个静态方法分别完成了“计算待入库的订单的价值”、”产生信使订单“、和“通知客户订单延期”。这样当上一层需要完成相应的功能是,业务逻辑层直接调用相关的静态方法即可完成。

下面的代码是一个典型的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 methods

        private 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:

image

在其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。

posted on 2011-01-24 23:22  李志鹏  阅读(331)  评论(0)    收藏  举报

导航