c#在域驱动设计中放置业务规则

Mad*_*Max 3 c# domain-driven-design business-rules

我正在学习域驱动设计,我对我应该制定业务规则的地方有点困惑.假设我有一个名为Member的聚合根,它保存对实体密码的引用.密码看起来像这样:

public class Password
{
    public string Hash { get; private set; }
    public string Salt { get; private set; }
    public DateTime ExpirationDate { get; private set; }

    public void GenerateNewPassword(string plainPassword)
    {
        //Some logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个名为Settings的设置对象.设置从设置存储库加载.该对象引用了另一个名为PasswordRules的对象.密码规则当然会检查方法CheckPasswordRequirements中的密码要求:

public bool CheckPasswordRequirements(string password)
{
    //Some logic here
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,它是保存此密码规则的最佳位置,还是应该将此方法移至Password类,因为密码对象负责检查给定的普通密码是否符合要求(然后我还应将设置存储库放在密码实体中)或者是否应该在创建成员对象的服务中直接进行此检查?也许还有其他一些优雅的解决方案?

Adr*_*ips 5

从DDD的角度来看,如果密码检查涉及的不仅仅是Password实体,那么应该放在域服务中.这些可以放在您的实体中,放在域模型的相关命名空间中.

如果这是一个更广泛的流程,包括更高应用程序级别的许多步骤(特别是如果流程不是您域的核心部分),那么您可能希望将功能放在域外的应用程序服务中.