我正在学习域驱动设计,我对我应该制定业务规则的地方有点困惑。 假设我有一个名为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
}
}
我还有一个名为Settings的设置对象。设置从设置存储库加载。 该对象引用了另一个名为PasswordRules的对象。密码规则当然会检查方法CheckPasswordRequirements中的密码要求:
public bool CheckPasswordRequirements(string password)
{
//Some logic here
}
所以我的问题是,它是保存此密码规则的最佳位置,还是应该将此方法移至Password类,因为密码对象负责检查给定的普通密码是否符合要求(然后我还应该将设置存储库放入密码实体)或者是否应该直接在创建成员对象的服务中进行此检查? 也许还有其他一些优雅的解决方案?
答案 0 :(得分:5)
从DDD的角度来看,如果密码检查涉及的内容超过Password
实体,则应将其置于域服务中。这些可以放在域模型中相关命名空间中的实体旁边。
如果这是一个更广泛的流程,包括更高应用程序级别的许多步骤(特别是如果流程不是您域的核心部分),那么您可能希望将该功能放在应用程序服务中在你的域之外。
答案 1 :(得分:2)
没有明确的答案可以从业务逻辑中得出。两种方法都同样有效。我会采取更务实的观点:
CheckPasswordRequirements
方法直接放在Password
类中,并在c'tor中调用它。PasswordChecker
)。作为变体,您也可以使用扩展方法执行此操作:
static class PasswordExtension
{
public static bool CheckPasswordRequirements(this string password)
{
//Some logic here
}
}