xman44,杨子莹,康熙来了20091118
本文介绍从ddd(domain-driven design[领域驱动设计])的角度来说说为什么要使用entity framework(以下都会简称为ef),同时也看出类似drapper之类的简陋orm不足的地方。
设想业务都是大家知晓的权限管理,实体类如下。
public partial class user { /// <summary> /// 用户名 /// </summary> public string username { get; set; } /// <summary> /// 用户密码 /// </summary> public string password { get; set; } public virtual icollection<role> roles { get; set; } } public partial class role { /// <summary> /// 角色id /// </summary> public int id { get; set; } /// <summary> /// 角色名称 /// </summary> public string name { get; set; } }
读到这里,请先思考一下,给一个 user
添加一个新的 role
,你会怎么写代码?,然后再接下去看看ddd认为应该怎么写。
//上面的user类,只是对数据库做简单映射的模型,在ddd思想中也称为 贫血模型 //接下来,我们把user类变成一个真正的 领域模型,也就是说 领域模型 会包含有业务逻辑! public partial class user { /// <summary> /// 给用户添加一个新的角色 /// </summary> /// <param name="role"></param> public void addrole(role role) { //业务逻辑:先判断该用户是否已经拥有该角色,没有才能添加。 if (!this.roles.any(x => x.id == role.id)) { this.roles.add(role); } //这里的代码是ado.net,drapper之类是做不到这样的。 //所以要实现ddd,必须配上ef之类的强大的orm。 } }
接下来,我们来看看怎么调用,可以看出一切都是围绕user这个领域模型的。
var user = userservice.getuserbyid(userid); user.addrole(role);//可以看出用了领域模型后,代码更加oop了~ userservice.update(user);
更加理想的ddd,是连userservice都不要,但目前很难实现这种做法。
var user = user.init(userid); user.addrole(role); user.savechange()
理想很丰满,现实很骨感,除了技术不能完全实现ddd的思想,我们还要考虑性能问题,
所以目前的ddd的做法是推荐搜索功能,也就是说搜索出现的数据作展示用,不会再对搜索出来的数据进行增删改,那么就怎么快怎么来。你爱用drapper也行,用ef+原生sql也行,用ado.net也行。
不是说面向过程化的思想不行,能抓老鼠的就是好猫。
但前辈们的经验是,面对复杂的业务,用ddd的思想来解决会更好。
所以
今天你oop,ddd了吗?^_^
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论