c# - 使用 C# : A better design to perform validation in Value Objects 清理架构

标签 c# .net-core domain-driven-design clean-architecture

我正在创建一个应用程序,其架构基于 Uncle Bob's Clean Architecture概念和 DDD .请注意,它基于 DDD,因此我给了自己与严格的 DDD 不同的自由。

为了创建这个应用程序,我使用了 C# 和 .Net Standard 2.0

DDD 的原则之一与值对象有关。值对象的定义,根据 Wikipedia如下:

Value Object

An object that contains attributes but has no conceptual identity. They should be treated as immutable.

Example: When people exchange business cards, they generally do not distinguish between each unique card; they only are concerned about the information printed on the card. In this context, business cards are value object

现在,如果某些验证不成功,我希望我的值对象不允许创建它们。当它发生时,将在实例化过程中抛出异常。我真的打算在那里抛出一个异常,因为架构的核心确实不希望任何无效数据达到那个点。

在进一步讨论这个问题之前,先给大家一些背景知识,here是我的架构(注意:仍然不完整):

My Clean Architecture Proposal

我在这个架构中遵循的规则是:

  1. 一个层只能知道它的最内层相邻层的接口(interface)
  2. 层无法知道任何最外层的信息
  3. 层之间的所有通信都必须通过接口(interface)完成
  4. 每一层都必须可以独立部署
  5. 每一层必须是可独立开发的

为了更好地理解图中的箭头,我建议阅读那些 Stack Exchanges 的问题:

Explanation of the UML arrows

https://softwareengineering.stackexchange.com/questions/61376/aggregation-vs-composition

现在,我现在面临的挑战是找到一种使用验证器的好方法。在这一点上,我对我的架构不满意。问题如下:

因为我可以在给定时间实例化数千个值对象,所以我不希望值对象的每个实例都有一个实例方法来执行验证。我希望验证方法是静态的,因为它的逻辑对于每个实例都是相同的。此外,我希望架构的上层可以使用验证逻辑来​​执行验证,而无需尝试实例化值对象,从而导致抛出昂贵的异常。

问题是:C# DOES NOT ALLOW 静态方法的多态性,所以我不能做类似的事情:

internal interface IValueObject<T>
{
    T Value { get; }
    static bool IsValid(T value);
}

如何在不依赖静态方法多态性的情况下实现此功能,同时不浪费内存?

最佳答案

你可以抽象地思考是件好事,但你应该在编写一些工作代码后进行概括。

一个通用的、整洁的、适合所有架构的 DDD 是一个秘籍。实际上 DDD 只适用于 Domain 层。这就是它的美妙之处,它与技术无关。

在我的项目中,我什至没有用于值对象、实体或聚合根的基类或接口(interface)。我不需要它们。所有这些构建 block 都是 POPO (PHP)。

在我看来,整洁的架构是使领域层技术不可知的架构,不依赖于任何外部框架。其他层几乎可以是任何东西。

关于c# - 使用 C# : A better design to perform validation in Value Objects 清理架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307434/

相关文章:

c# - 没有具有键 'IEnumerable<SelectListItem>' 的 'Carrera' 类型的 ViewData 项

c# - .net core 应用程序中 ServicePointManager.DefaultConnectionLimit 的最高安全数是多少?

java - 域对象中的持久性注释是一种不好的做法吗?

javascript - ASP.NET Core MVC Controller 从 ajax 调用接收输入参数为 null

.net-core - 为什么 dotnet 运行启动 2 个进程?

architecture - DDD - 来自其他有界上下文的验证引用 ID

namespaces - 如何在 CQRS 中构造分离和命名空间?

c# - 如何在 ASP.NET MVC 5 应用程序和 .NET 控制台应用程序之间共享数据库?

c# - 查找包含特定文本的 MS Word 表

c# - ADO.NET Entity Framework 是否具有类似于 LINQ to SQL 的 GetTable<T> 的结构?