我正在创建一个应用程序,其架构基于鲍勃叔叔的清洁架构概念和DDD。请注意,它基于DDD,所以我给了自己与严格 DDD 不同的自由。
为了创建这个应用程序,我使用 C# 和 .Net Standard 2.0
DDD 的原则之一与值对象有关。根据Wikipedia ,值对象的定义如下:
值对象
包含属性但没有概念标识的对象。它们应该被视为不可变的。
示例:人们在交换名片时,一般不会区分每张唯一的名片;他们只关心印在卡片上的信息。在这种情况下,名片是价值对象
现在,如果某些验证不成功,我希望我的值对象不允许创建它们。当它发生时,实例化过程中会抛出异常。我真的打算在那里抛出一个异常,因为架构的核心确实不希望任何无效数据到达那个点。
在进一步讨论这个问题之前,为了给你们更多的背景知识,这是我的架构(注意:仍然不完整):
我在这个架构中遵循的规则是:
- 一个层只能知道其最内层邻居层的接口
- 一个层不能知道任何最外层的任何信息
- 层之间的所有通信都必须通过接口完成
- 每一层都必须是可独立部署的
- 每一层都必须是可独立开发的
为了更好地理解此图中的箭头,我建议阅读 Stack Exchanges 的问题:
https://softwareengineering.stackexchange.com/questions/61376/aggregation-vs-composition
现在,我现在面临的挑战是找到一种使用验证器的好方法。在这一点上,我对我的架构并不满意。问题如下:
由于我可以在给定时间实例化数千个值对象,因此我不希望值对象的每个实例都有一个实例方法来执行验证。我希望验证方法是静态的,因为每个实例的逻辑都是相同的。此外,我希望架构的上层可以使用验证逻辑来执行验证,而无需尝试实例化值对象,从而导致抛出昂贵的异常。
问题是:C# DOES NOT ALLOW polymorphism with static methods,所以我不能做类似的事情:
internal interface IValueObject<T>
{
T Value { get; }
static bool IsValid(T value);
}
如何在不依赖静态方法多态性的情况下实现此功能,同时又不浪费内存?