架构之旅~底层提供一个统一的GetModel()的重要性
在我们开始项目过程中,项目中通常会存在几个主要的对象,如你在设计“B2C”时,可能主要对象是“用户对象”,“产品对象”,“订单对象”,而这些对象的信息应该对我们来说是很重要的,当用户删除自己的产品时,我们可能不希望产品真的从数据库中被删除除,这时,我们在设计数据库时可能会把这几个对象所对应的表加上“状态”字段,即Status,它通常是int32类型的,而在程序中一般会对应一个枚举类型,你当然可以也叫它Status
而今天要讲的GetModel()它只是本人封装的一个方法,它会在DATA层出现,为每个带个Status属性的对象实现一个GetModel()方法,而这个方法中我们会过滤一些统一的条件,如过滤掉被删除的对象,过滤掉登陆不活跃的对象等等,而这些操作通常具有统一性,即,它对前台所有业务都是一样的,也就是说:BLL(业务层)再进行查询组合时,不会直接从数据源中读取,而是从DATA层提供的GetModel()中去读取,这样的好处很容易理解,就是实现了调用上的“统一”,当我们要修改“过滤的条件”时候,只要修改DATA层的GetModel()方法即可。
核心代码如下:
1 public class UserRepository : TestRepositoryBase 2 { 3 /// <summary> 4 /// 得到默认的结果集 5 /// </summary> 6 /// <returns></returns> 7 public IQueryable<User> GetModel() 8 { 9 return _db.Set<User>() 10 .Where(i => i.Status != (int)Status.Deleted) 11 .OrderByDescending(i => i.ID); 12 } 13 }
而在BLL层进行条件组合查询时,可以直接调用GetModel(),而不要自己在BLL层再使用以下的方法:
1 /// <summary> 2 /// 业务层得到完整的用户信息 3 /// </summary> 4 /// <returns></returns> 5 public IQueryable<User> GetUser() 6 { 7 var linq = from data1 in _db.Set<User>().Where(i => i.Status != (int)Status.Deleted).OrderByDescending(i => i.ID) 8 join data2 in _db.Set<User_Profile>() on data1.ID equals data2.ID 9 select data1; 10 return linq; 11 }
我想大家已经看到了上面方法的不足之处,当有第二个业务用到User对象时,你还要重要去组装你的条件,而使用GetModel()我们在业务层不用去管数据有效性
这方法的基础过滤工作。