一、贫血模型
所谓贫血模型,是指Model 中,仅包含状态(属性),不包含行为(方法),采用这种设计时,需要分离出DB层,专门用于数据库操作。
二、充血模型
Model 中既包括状态,又包括行为,是最符合面向对象的设计方式。
以下为举例说明:
对于员工Employee来说,每个员工的属性有Id,Name,Sex,BirthDay,Parent(上级),行为有查找,保存,删除,职位调整(更换上级) 等
采用贫血模型实现
Model:
1 public class Employee 2 { 3 public string Id { get; set; } 4 public string Name { get; set; } 5 public string Sex { get; set; } 6 public DateTime? BirthDay { get; set; } 7 /// <summary> 8 /// 直属上级的Id 9 /// </summary> 10 public string ParentId { get; set; } 11 }
DB 层
1 //实现方法略 2 public class EmpDAO 3 { 4 public static bool AddEmployee(Employee emp); 5 public static bool UpdateEmployee(Employee emp); 6 public static bool DeleteEmployee(Employee emp); 7 public static Employee GetEmployeeById(string Id); 8 }
BLL 层
1 public class EmpBLL 2 { 3 public void Test() 4 { 5 Employee emp1 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "张三", Sex = "男" }; 6 Employee emp2 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "李四", Sex = "男", ParentId = emp1.Id }; 7 //插入员工 8 EmpDAO.AddEmployee(emp1); 9 EmpDAO.AddEmployee(emp2); 10 11 //取员工的上级 12 var emp2Parent = EmpDAO.GetEmployeeById(emp2.ParentId); 13 var emp2Parent_Parent = EmpDAO.GetEmployeeById(emp2Parent.ParentId); 14 15 //删除员工 16 EmpDAO.DeleteEmployee(emp1); 17 EmpDAO.DeleteEmployee(emp2); 18 } 19 }
若采用充血模型设计,则应只分两层 ,Model 层(包含状态和行为)和Service(BLL) 层
Model 层
1 public class Employee 2 { 3 public string Id { get; set; } 4 public string Name { get; set; } 5 public string Sex { get; set; } 6 public DateTime? BirthDay { get; set; } 7 /// <summary> 8 /// 直属上级的Id 9 /// </summary> 10 public string ParentId { get; set; } 11 private Employee _parent; 12 13 public static Employee query(string id) 14 { 15 Employee emp = new Employee(); 16 //实现略,仅需填充emp的熟悉即可 17 return emp; 18 } 19 /// <summary> 20 /// 保存对象,实现略 21 /// </summary> 22 /// <returns></returns> 23 public bool Save() 24 { 25 return true; 26 } 27 /// <summary> 28 /// 删除对象,实现略 29 /// </summary> 30 /// <returns></returns> 31 public bool Drop() 32 { 33 return true; 34 } 35 /// <summary> 36 /// 上级领导,此处直接获得了Employee对象 37 /// </summary> 38 public Employee Parent 39 { 40 get 41 { 42 if (_parent != null) 43 { 44 return _parent; 45 } 46 else 47 { 48 _parent = query(this.ParentId); 49 return _parent; 50 } 51 } 52 set 53 { 54 _parent = value; 55 this.ParentId = _parent.Id; 56 Save(); 57 } 58 } 59 }
Service 层
1 public class EmpService 2 { 3 public void Test() 4 { 5 Employee emp1 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "张三", Sex = "男" }; 6 Employee emp2 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "李四", Sex = "男", ParentId = emp1.Id }; 7 //插入员工 8 emp1.Save(); 9 emp2.Save(); 10 11 //取员工的上级 12 var emp2Parent = emp2.Parent; 13 var emp2Parent_Parent = emp2Parent.Parent; 14 15 //删除员工 16 emp2.Drop(); 17 emp1.Drop(); 18 } 19 }
总结:
从两者Service层和BLL 层的代码区分来看,两者都是实现了业务功能和延迟加载。
贫血模型优点是系统的层次结构清楚,各层之间单向依赖。缺点是不够面向对象。
充血模型优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。缺点是比较复杂,对技术要求更高。
原文:https://www.cnblogs.com/IT-Evan/p/Model2.html