微型项目实践(5):Business层代码分析——实体基类
if (database == null)
4: throw new ArgumentNullException("database");
5:
6: var validateResult = this.Validate(database);
7: if (!validateResult.IsValidated)
8: throw new ValidateFailException(validateResult);
9:
10: SaveAction(database);
11: }
Validate、Save和Delete所带的参数都是IDatabase接口,这个接口定义了数据库所要实现的全部操作 ,应该说是一个非常粗颗粒度的接口(虽然现在该接口只有一个方法)。使用粗颗粒度的接口的好处是: 实体类内部在处理与自身相关的数据时,可以访问到整个数据库,使用起来方便。从逻辑上讲,这三个方 法使用数据库作为参数,表示在该数据上下文环境中,执行Validate、Save和Delete操作,意思也是很清 晰的。后面会出现的对于数据库的操作,都将以这种粗颗粒度的接口作为参数。不过使用粗颗粒度的接口 也要注意,实现机制不能过于臃肿,不然构造太多的实例会影响系统性能,我们使用Lazy Load解决这个 问题,在分析数据访问的实现时,我们还会回到这个问题上来。 EntityExtension这个类提供了一个非常常用的扩展方法:根据ID取得实体: 1: /// <summary> 2: /// 根据ID取得实体 3: /// </summary> 4: /// <typeparam name="T">实体类型</typeparam> 5: /// <param name="query">实体查询</param> 6: /// <param name="id">ID</param> 7: /// <returns>对应的实体,不存在则返回空</returns> 8: public static T GetByID<T>(this IQueryable<T> query, int id) 9: where T : Entity<T> 10: { 11: if (query == null) 12: throw new ArgumentNullException("query"); 13: 14: return query.SingleOrDefault(entity => entity.ID == id); 15: } 有了这个方法,结合数据访问接口,就可以通过这样的方式取得一个Blog: database.GetDataAccess<Blog>().GetByID(1); 该方式,以后还会进一步简化为:database.Blogs.GetByID(1); 今天我们分析了实体基类的代码和设计方式,下一篇中我们将着重研究数据访问两个接口的设计与实 现。 本文配套源码 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |