validation - 领域驱动设计 - 实体的访问修饰符和强制验证

标签 validation domain-driven-design

我对 DDD 非常陌生,并且在 stackoverflow 和网络上阅读了有关验证(将其放在哪里)的各种讨论。我确实喜欢将验证保留在实体之外并根据上下文对其进行验证的想法。在我们的项目中,我们有一个名为 MedicalRecord 的实体,并且对于何时可以创建或保存实体有各种规则。我想创建一个服务层,比如说 RecordService,它会做一些检查,以确保用户在创建医疗记录之前是否可以创建医疗记录。我还想创建 MedicalRecordRepository 来保存医疗记录。让我困惑的是我的实体和存储库类的访问权限修改。由于两者都是公开的,我如何强制应用程序的客户端使用该服务,而不是仅仅创建新的医疗记录(使用公共(public)构造函数)并使用存储库来保存它?我正在使用c#。我知道 DDD 与语言无关,但想知道是否有人可以对此提供一些想法。

谢谢。

最佳答案

您必须通过将创建者设置为非公开并仅允许通过工厂创建来控制记录创建:

public class MedicalRecord
{
    internal MedicalRecord()
    {
    }
}

public static class MedicalRecordFactory
{
    public static MedicalRecord Create(User onBehalfOf)
    {
        // do logic here
        return new MedicalRecord();
    }
}

要使 internal 关键字适用,两个类必须位于同一程序集中,或者类程序集必须允许使用 InternalsVisibleTo 属性访问工厂程序集。

编辑

如果您需要能够随时执行验证,您还必须将验证逻辑封装在另一个类中(此处部分通过扩展方法完成):

public static class MedicalRecordValidator
{
    public static bool IsValid(this MedicalRecord medicalRecord, <context>)
    {
        return IsValid(<context>);
    }

    public static bool IsValidForCreation(User onBehalfOf)
    {
        return IsValid(null, onBehalfOf);
    }

    private static bool IsValid(<context> context, User user = null)
    {
        // do validation logic here
    }
}

然后,工厂可以这样做:

public static MedicalRecord Create(User onBehalfOf)
{
    return IsValidForCreation(onBehalfOf) ? new MedicalRecord() : null;
}

你也可以这样做:

if (myMedicalRecord.IsValid(<context>))
{
    // ....

关于validation - 领域驱动设计 - 实体的访问修饰符和强制验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692422/

相关文章:

asp.net-mvc - 页面加载时显示 MVC-5 Razor 验证错误

python - Django Forms.py 电子邮件和电话验证

domain-driven-design - 非程序化软件开发可行吗?

domain-driven-design - CQRS 命令和查询 - 它们是否属于域?

rest - API 基础设施类是否应该成为 DDD 领域的一部分?

javascript - Angular 表单验证 ng-disabled 不起作用

java - Spring+Hibernate验证: throws Hibernate Exceptions and not Spring exceptions

javascript - 如何从 JavaScript 中的下拉列表中验证 DOB?

entity - DDD - ConcurrencySafeEntity 它的用途是什么

domain-driven-design - DDD : What kinds of behavior should I put on a domain entity?