栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在DDD中将全局规则验证放在何处

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在DDD中将全局规则验证放在何处

在大多数情况下,最好将此类规则放在

Specification
对象中。您可以将这些
Specification
放入您的域包中,因此任何使用您的域包的人都可以访问它们。使用规范,您可以将业务规则与实体捆绑在一起,而无需创建对服务和存储库具有不期望依赖性的难以阅读的实体。如果需要,可以将对服务或存储库的依赖项注入到规范中。

根据上下文,您可以使用规范对象构建不同的验证器。

实体的主要关注点应该是跟踪业务状态-这足以承担责任,并且他们不应该关注验证。

public class User{    public string Id { get; set; }    public string Name { get; set; }}

两种规格:

public class IdNotEmptySpecification : ISpecification<User>{    public bool IsSatisfiedBy(User subject)    {        return !string.IsNullOrEmpty(subject.Id);    }}public class NameNotTakenSpecification : ISpecification<User>{    // omitted pre to set service; better use DI    private Service.IUserNameService UserNameService { get; set; }    public bool IsSatisfiedBy(User subject)    {        return UserNameService.NameIsAvailable(subject.Name);    }}

和验证器:

public class UserPersistencevalidator : IValidator<User>{    private readonly IList<ISpecification<User>> Rules =        new List<ISpecification<User>> {     new IdNotEmptySpecification(),     new NameNotEmptySpecification(),     new NameNotTakenSpecification()     // and more ... better use DI to fill this list };    public bool IsValid(User entity)    {        return BrokenRules(entity).Count() > 0;    }    public IEnumerable<string> BrokenRules(User entity)    {        return Rules.Where(rule => !rule.IsSatisfiedBy(entity))         .Select(rule => GetMessageForBrokenRule(rule));    }    // ...}

为了完整起见,这些接口:

public interface IValidator<T>{    bool IsValid(T entity);    IEnumerable<string> BrokenRules(T entity);}public interface ISpecification<T>{    bool IsSatisfiedBy(T subject);}

笔记

我认为Vijay
Patel的较早答案是朝正确的方向发展,但我觉得有些偏离。他建议用户实体取决于规范,我认为应该与规范相反。这样,您可以使规范通常依赖于服务,存储库和上下文,而无需通过规范依赖关系使您的实体依赖于它们。

参考文献

埃里克·埃文斯(Eric Evans)在第9章145页中介绍了使用规范模式进行验证,选择和对象构建。

该文章的规格模式:在.NET应用程序可能是你的兴趣。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451314.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号