我试图第一次进入DDD,我问了一个关于批量导入here的问题,但我正在尝试为我的域模型应用验证。DDD验证没有抛出异常
本质上我想通过所有验证而不抛出异常,以便我可以通过Command对象内的CommandResult对象列表拒绝所有验证错误。虽然有些只是可配置的强制性现场检查,所以会在聚合之外进行处理,但也有业务规则,所以我不想复制验证逻辑,也不想陷入贫血模式以维持总是有效的实体口头禅。
我有些失落,所以认为这是最好的我问专家,如果这是我正确的事情开始之前,我开始进一步混淆水域!
要尝试并展示:
就拿下面,我们有相当简单的用户配置骨料,构造函数接受一个配置文件存在必需的信息。
public class UserProfile : AggregateRoot
{
public Guid Id {get; private set; }
public Name Name {get private set;}
public CardDetail PaymentInformation {get; private set;}
public UserProfile(Guid id, Name name, CardDetail paymentInformation)
{
Name = name;
PaymentInformation = paymentInformation;
}
}
public class CardDetail : ValueObject
{
public string Number {get; private set;}
public string CVC {get; private set; }
public DateTime? IssueDate {get; private set;}
public DateTime ExpiryDate {get;private set;}
public CardDetail(string number, string cvc, DateTime? issueDate, DateTime expiryDate)
{
if(!IsValidCardNumber(number))
{
/*Do something to say details invalid, but not throw exception, possibly?*/
}
Number = number;
CVC = cvc;
IssueDate = issueDate
ExpiryDate = expiryDate;
}
private bool IsValidCardNumber(string number)
{
return Regex.IsMatch(/*regex for card number*/);
}
}
然后我有一个接受命令的对象,这将构建一个用户配置并保存到数据库的方法,但我想节省
public void CreateProfile(CreateProfileCommand command)
{
var paymentInformation = new CardDetail(command.CardNumber, command.CardCVC, command.CardIssueDate, command.CardExpiryDate)
var errors = /* list of errors added to from card detail validation, possibly? */
var profile = new UserProfile(/* pass args, add to errors? */
if(errors.Any())
{
command.Results.Add(errors.Select(x => new CommandResult { Severity = Severity.Error, Message = x.Message });
return;
}
/* no errors, so continue to save */
}
现在,我能处理异常之前验证和将它们添加到命令结果中,但这似乎很昂贵,肯定违反了允许异常来控制流的规则?但另一方面,我想保持实体和价值对象的有效性,所以我发现自己有点尴尬!
另外,在上面的示例中,配置文件可以从创建屏幕手动导入或完成,但用户应该获取所有错误消息,而不是每个错误消息的顺序。在我正在开发的应用程序中,所应用的规则稍微复杂一点,但这个想法是一样的。我知道我不应该让UI关注影响域,但我不希望再次复制所有验证,以便我可以确保命令不会失败,因为这会导致可维护性问题更进一步(我发现自己并尝试解决的情况)
不幸的是我不清楚你想要什么。看起来你正在寻找一些关于如何构建解决方案的指导,这让我认为这是一个*太广泛的问题*。如我错了请纠正我。 – Alisson
对不起,它似乎有点含糊。我会用一个模拟我面对的情况来更新这个问题,而这个情况应该会有所帮助! –