使用 IoC 在 SOA 应用程序中通过 DDD 进行验证

2024-01-16

在我的服务外观层中,我有一个服务类,其方法/操作接受 DTO(数据契约)对象。 AutoMapper 用于将此 DTO 映射到我的域对象的实例以应用任何更改。该请求被传递到我的域服务,该服务执行实际工作。该方法可能如下所示:

public EntityContract AddEntity(EntityContract requestContract)
{
    var entity = Mapper.Map<EntityContract, Entity>(requestContract);

    var updatedEntity = Service.AddEntity(entity);

    var responseContract = Mapper.Map<Entity, EntityContract>(updatedEntity);

    return responseContract;
}

Service 和 Mapper 属性是使用 Unity 作为 IoC 容器的构造函数注入来设置的。

在执行操作时,域服务对实体进行更改,然后使用存储库来保存更改,例如:

public Entity AddEntity(Entity entity)
{
    // Make changes to entity

    Repository.Add(entity);

    // Prepare return value
}

存储库也是使用构造函数注入来设置的。

问题是,数据一旦被持久化,就立即可供其他客户端使用,因此我必须确保不会持久化任何无效数据。我读过 DDD (Evans) 和 Nilsson 的“蓝皮书”,但不清楚我应该采取什么方法进行验证。

如果我的目标是防止实体进入无效状态,我是否应该在服务方法中验证entityContract,以确保在将请求传递到域服务之前满足所有规则?我犹豫是否要这样做,因为在服务外观中定义这些规则似乎破坏了封装。

我们使用薄的外观层委托给域服务的原因是,我们在 API 中公开了粗粒度的接口,但通过细粒度的域服务的组合来支持重用。请记住,多个外观服务可能会调用相同的域服务方法,也许将这些规则委托给域服务会更好,这样我们就知道每次使用都经过验证。或者我应该在两个地方验证?

我还可以在属性设置器中放置防护装置,以防止不可接受的值将实体置于无效状态。这意味着 AutoMapper 在尝试映射无效值时会失败。但是,当没有映射任何值时,它没有帮助。

我仍然无法摆脱这样的想法:这些规则是实体行为的一部分,并且确定对象是否有效应该封装在实体内。这是错误的吗?

因此,首先我需要确定何时何地执行这些验证检查。然后我需要弄清楚如何使用 DI 来实现,以便解耦依赖关系。

您能提供什么建议?


我读过 DDD(Evans)和 Nilsson 的“蓝皮书”,但我没有读过 明确我应该采取什么方法进行验证。

蓝皮书从不同的角度解决了这个问题。我认为不使用“验证”一词是因为它是危险的过度概括 http://lostechies.com/jimmybogard/2009/02/15/validation-in-a-ddd-world/。更好的方法是思考对象不变量,而不是验证。对象(不仅在 DDD 中)应该自行强制执行其内部不变量。它不是 UI、服务、合约、映射器、“验证框架”或对象外部的任何其他内容。不变量在内部强制执行。您可能会发现这些答案很有帮助:1 https://stackoverflow.com/questions/7093819/should-domain-objects-be-allowed-to-be-temporarily-invalid-and-how-does-that-dec/7096430#7096430, 2 https://stackoverflow.com/questions/6966288/ddd-client-side-validation/7019985#7019985, 3 https://stackoverflow.com/questions/7132468/how-to-enforce-constraint-such-as-any-field-or-specific-field-must-not-change-i/7133121#7133121, 4 https://stackoverflow.com/questions/7139831/bl-services-exception-or-method-result/7141395#7141395.

我还可以在属性设置器中放置警卫,以防止 将实体置于无效状态时产生的不可接受的值 状态。这意味着 AutoMapper 在尝试映射时会失败 无效值。

您可能根本不应该关心 AutoMapper 失败或使用 AutoMapper。领域对象应该封装并强制执行其内部不变量,并在尝试破坏它时抛出异常。它非常简单,您不应该因为一些基础设施问题而损害域对象的简单性和表现力。 DDD 的目标不是满足 AutoMapper 或任何其他框架的要求。如果该框架不适用于您的域对象,请不要使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IoC 在 SOA 应用程序中通过 DDD 进行验证 的相关文章

随机推荐