Mic*_*thy 3 validation domain-driven-design
现在,我有一个名为StyleBundle的域名实体.这个StyleBundle有一个样式列表:
public class StyleBundle
{
public StyleBundle(List<Style> styles)
{
this.Styles = styles;
}
public IEnumerable<Style> Styles { get; private set;}
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的原始设计中,永远不应该使用空样式列表创建StyleBundle.领域专家基本上说这是一个很好的规则.
我在构造函数中使用guard子句写了这个:
if (styles.Count() == 0)
throw new Exception("You must have at least one Style in a StyleBundle.");
Run Code Online (Sandbox Code Playgroud)
这确保我无法在无效状态下创建StyleBundle.我认为这里的异常是有道理的b/ca StyleBundle在没有至少一个Style的情况下被创建在系统中是特殊的.
当然,在项目的其余部分进行改变时,现在应该可以让用户创建没有样式的StyleBundle,但是不应该允许他们在没有样式的情况下使用StyleBundle.
所以现在我正在查看我的guard子句,并意识到我不能再从构造函数中抛出异常了.
接下来,我有一个服务/应用程序层,我的代码隐藏在他们使用StyleBundles时与之交互.在我的服务层中,我有一个StyleBundleService类,该类向UI公开基本功能......其中包括"CreateStyleBundle".
似乎我必须检查我的服务层以查看StyleBundle在持久存储到数据库之前是否有任何样式,但是这个决定对我来说感觉"错误".
有人碰到类似的事吗?基本上,当"新建"时对象的状态与持久性时相同对象的状态之间的差异?
谢谢!麦克风
我会IsValid为你的实体添加一个方法.这将检查实体当前是否处于有效状态(在您的情况下,检查是否存在样式).
可以从您的方法调用此方法Repository来检查实体是否可以持久化.您可以IsValid为特定实体的方法添加更多规则,并且您可以实现诸如验证错误集合之类的内容,您希望抛出有意义的异常.