我在理解存储库域对象关系时遇到了一些小问题。以下是我所了解的关于域名设计的一些信息(它们也可能是错误的或不准确的)。考虑到这些,我找不到从存储库获取域对象的方法。如何从存储库中检索域对象
在DDD中,域应该只知道和包含业务所需要的内容,其他所有内容都必须从域中清除。没关系。并且从任何业务中抽象数据访问也是一个很好的做法。应用程序不需要知道我们存储数据的位置或我们如何存储数据。我们只要求存储库给我们一个域对象,它给了我们我们想要的对象或者另一种方式也是有效的,我们给存储库一个域对象并将它发送到存储器。
为面向对象声明公共setter对于面向对象的设计来说也是一个非常糟糕的方法,因为我们将无法控制谁正在访问什么并更改什么。因此,只公开需要在对象外部需要的东西是一种很好的做法。
因此,在我的脑海中,我无法想出实现我的存储库的方法。我可以在我的代码中使用任何ORM或纯SQL,并检索数据。
但我无法从持久对象创建域对象;
- 由于他们没有公共setter,我不能创建和设置字段值。
- 声明包含所有字段的公共构造函数看起来不正确。我可能需要填写几个模型,这意味着我必须定义几个具有不同参数集的构造函数。
任何帮助将不胜感激...
感谢您的提示。但是我读过一篇提到领域模型和持久性模型的文章是两个不同的集合,我认为这是正确的。在我目前的项目中,有一个非常糟糕的db-first设计,它是域逻辑的完全灾难。这就是为什么我不想使用我的EF实体。所以我需要一个更好的方式表达所需域的独立域类集。我的问题是;我如何从EF实体中获取数据到我的域对象,这些对象不公开公共属性? HTTP://www.sapiensworks。com/blog/post/2012/04/20/Dont-Use-ORM-Entities-To-Model-The-Domain.aspx – ayk
您的存储库(特定数据映射器)可负责将EF实体映射到域实体。我可以使用单个公共构造函数来构建域实体。还有一点提示 - 你的映射器可能类似于Builder或Factory模式。 –
如果您要手动绘制地图,那么请考虑彻底删除EF模型,因为它只会减慢速度。您的存储库可以使用普通的DataReader。 –