You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类重写方法需额外参数:DDD项目用户仓储新增方法设计疑问

针对DDD仓储层用户注册场景的实现方案

方案1:创建用户注册专用参数类

既然passwordHash和passwordSalt仅用于持久化、无领域逻辑需求,可以定义一个用户注册参数类封装这两个字段,让UserRepository的新增方法接收该参数与领域类:

public class UserRegistrationParams
{
    public string PasswordHash { get; set; }
    public string PasswordSalt { get; set; }
}

public class UserRepository : BaseRepository<User>
{
    public void Add(User user, UserRegistrationParams registrationParams)
    {
        // 内部将领域类与注册参数映射为持久化类
        var userEntity = MapToPersistence(user, registrationParams);
        DbContext.UserEntities.Add(userEntity);
        DbContext.SaveChanges();
    }
}

这种方式既不污染领域类,也能清晰传递持久化所需的额外参数,符合DDD“领域模型只关注核心业务逻辑”的原则。

方案2:直接重载Add方法接收参数

如果不想额外创建类,可直接重载Add方法,将两个字段作为参数传入,在仓储内部完成与领域类的映射:

public class UserRepository : BaseRepository<User>
{
    public void Add(User user, string passwordHash, string passwordSalt)
    {
        var userEntity = new UserEntity
        {
            // 映射领域类属性
            Id = user.Id,
            Username = user.Username,
            // 赋值持久化专属字段
            PasswordHash = passwordHash,
            PasswordSalt = passwordSalt
        };
        DbContext.UserEntities.Add(userEntity);
        DbContext.SaveChanges();
    }
}

该方式更简洁,适合参数较少的场景,同样不会对领域模型造成侵入。

方案3:复用现有映射逻辑补充字段

如果项目已有成熟的领域类到持久化类的映射框架(如AutoMapper),可在映射完成后手动补充持久化专属字段:

public class UserRepository : BaseRepository<User>
{
    private readonly IMapper _mapper;

    public UserRepository(IMapper mapper)
    {
        _mapper = mapper;
    }

    public void Add(User user, string passwordHash, string passwordSalt)
    {
        var userEntity = _mapper.Map<UserEntity>(user);
        // 补充持久化专属字段
        userEntity.PasswordHash = passwordHash;
        userEntity.PasswordSalt = passwordSalt;
        DbContext.UserEntities.Add(userEntity);
        DbContext.SaveChanges();
    }
}

这种方式复用现有映射逻辑,减少重复代码,适合有统一映射框架的项目。

核心原则总结

  • 领域类仅维护有业务逻辑意义的属性,避免为持久化需求添加冗余字段,保持领域模型纯净;
  • 仓储层作为领域模型与持久化层的桥梁,负责处理两者的映射,包括补充持久化专属元数据;
  • 避免在领域服务或应用层处理持久化细节,保持各层职责单一。

内容的提问来源于stack exchange,提问作者manfrom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:12:33