ABP/DDD:将充血模型映射到EF Core

学习这个东西是这么一回事,打工这么久,有些时候是在把别人做过的东西按自己想法实现一遍。之前做上传三方报告的需求时候,其实别人已经做过上传诊断报告的需求了。

虽然两者实现的功能一样,但是代码设计上的是被秒成渣。自己做就是直接干,贫血模型一干到底,业务给domain,甚至全给application service。别人做就是充血模型,优雅。

前置笔记:领域驱动设计DDD:贫血模型和充血模型(比较重要)_董厂长的博客-CSDN博客

看注释!这边实现一个具有各种刁钻需求的充血模型:

public record User
{
	public int Id { get; init; }//特征一:只能初始化赋值
	public DateTime CreatedDateTime { get; init; }//特征一
	public string UserName { get; private set; }//特征一:只能在内部方法中改变
	public int Credit { get; private set; }
	private string? passwordHash;//特征三:不属于 属性 的 成员变量 映射为数据列
	private string? remark;
	public string? Remark //特征四:只读属性
	{
		get { return remark; } 
	}

	public string? Tag { get; set; }//特征五:不想映射到数据库

	private User()//特征二:给EF Core从数据库加载数据 然后生成user对象返回用的!
	{

	}

    public User(string yhm)//特征二:给普通用户创建对象用的
	    {
		    this.UserName = yhm;
		    this.CreatedDateTime = DateTime.Now;
		    this.Credit = 10;
	    }

	public void ChangeUserName(string newValue)
	{
		this.UserName = newValue;
	}

	public void ChangePassword(string newValue)
	{
		if (newValue.Length < 6)
		{
			throw new ArgumentException("密码太短");
		}
		this.passwordHash = HashHelper.Hash(newValue);
	}
}

重点复习一下特征2的原理

 

 

 为了完成这些特征,需要这样写配置:

class UserConfig : IEntityTypeConfiguration<User>
{
	public void Configure(EntityTypeBuilder<User> builder)
	{
		builder.Property("passwordHash");//特征三
		builder.Property(u => u.Remark).HasField("remark");//特征四
		builder.Ignore(u => u.Tag);//特征五
	}
}

业务代码中:

User u1 = new User("FuckRJ");
u1.Tag = "MyTag";
u1.ChangePassword("123456");
ctx.Users.Add(u1);
ctx.SaveChanges();

User u1 = ctx.Users.First(u=>u.UserName=="FuckRJ");
Console.WriteLine(u1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值