- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在阅读Evans关于DDD的书,并在思考如何在.NET中实现聚合。目前,我只能想出一种方法。将聚合隔离在单独的类库中。但是,这似乎有点矫kill过正(我宁愿将所有域对象都保留在一个库中),并且我想知道是否有其他方法吗?
1 lib/aggregate的理由如下:聚合根需要知道对其负责的“子对象”的所有访问,并且聚合根还可以作为其成员的结果返回子对象。因此,这些子对象的成员(需要聚合根)无法公开。因此,您唯一的选择是将它们设置为内部(因为它们仍需要由聚合根调用)。但是,通过将所有聚合放入一个项目中,仍然可以从已获得子对象的其他域对象访问这些成员。这是不希望的,因为它允许绕过聚合根。通过分离不同库中的所有聚合,可以解决此问题。
一些其他信息:
我已经检查了DDD java sample code,它们将每个集合(包括所有子对象的类)打包在一个不同的包中。只能从聚合根调用的成员没有访问修饰符(例如:Delivery.updateOnRouting
)。在Java中,没有访问修饰符的成员是package-private(仅可从同一软件包中获得)。因此,这将是正确的行为。
但是,.NET sample code将所有域对象放在一个类库中,然后将相应的成员公开。对我来说,这似乎是不正确的。
最佳答案
聚合是DDD中最困难的概念之一。您拥有大部分权利。我建议以“成员身份”的形式总体表达这个概念比引入“子对象”这一术语更为直接。
是的,一个对象不能是多个集合的成员。哪一个是最终的执行者?一个聚合根可以通过删除成员并孤立另一个聚合中的其他成员来轻易使另一个根失效。您是正确的,在一个对象似乎需要多个聚合成员的情况下,该对象必须是一个独立的实体,即它成为新聚合的根。 (它可能有也可能没有其他成员,但是如果没有,则它当然是它自己的一个成员的集合。)
是的,绝对存在强制执行不变性的集合。就持久性而言,它也是单个工作单元或单个事务。聚合根最终负责整个成员中的所有不变量,这必须是因为,例如,不变量的失败可能导致持久性失败,并且聚合负责将聚合作为一个可行的持久性工作单元维护。
但是,这是一个微妙而困难的部分,最终责任并不意味着合计也是主要强制实现者。就像我们在司法系统中所拥有的一样,法院最终是确定法律问题和施加最终法律规则的最终场所,而不变性则被强制执行。但是实际的执行(和遵从性)发生在系统的许多级别。实际上,在一个秩序井然的社会中,大多数实现法治的 Activity -对不变量的执行-应该早在上法庭之前就已经发生了,甚至根本不必依靠常规去上法庭。 (尽管在DDD中,您可能总是希望有一个聚合根,例如在持久性之前进行最后的不变扫描。)
您的建议是完全不同的,除了法院之外,您的整个社会实际上都被监禁了,您似乎甚至建议其他人甚至不能访问,他们只能向法院传递信息并希望它能适本地发挥作用。
让我们看看如果您按照建议的方式对您的域进行了处理。目的是创建一个丰富而富有表现力的领域模型。在有意义的普遍存在的语言方面,您已经将工作词汇量减少到了总的根。实体之所以应该被聚合根访问是因为不变量,而且还因为如果设计正确,则该实体具有有意义的身份,该身份是由于其在聚合根上下文中的成员身份而产生的。但是您的提案实体在其聚合根之外甚至没有任何类型标识。 Evans特别指出,这是聚合根的目的的一部分-允许对象通过遍历获取对成员的引用。但是您无法获得有用的引用,因为另一个对象甚至都不知道您的成员类型存在。或者,您可以更改 namespace ,但是如果您不允许遍历,那就更好了。现在,您的整个域都知道类型,但是无法获得对象的类型。
更糟糕的是您的聚合根发生了什么。聚合根除了维护聚合完整性外,通常还应有其自身存在的理由。但是现在这种身份不再明确。对于所有各种元素及其属性都需要有一个包装方法,这使它变得晦涩难懂。您得到的是不再具有表现力甚至清晰的身份的聚集的根,而只是庞大而笨拙的上帝对象。
您的Order和OrderLine示例就是一个有趣的例子。订单未执行代表订单行的订单行所需的某些不变式的强制执行。在这种情况下,它控制 Action 以强制执行自己的不变式。这是对聚集根进行 ionic 控制的有效措施。但是,更通常地,聚集大多数情况下与对象的创建和/或破坏有关。
当然,没有必要强加一个模型,在该模型中,状态的所有变化都必须由聚合根自动应用,而绝不能直接应用。实际上,这通常就是为什么聚合根允许遍历以获得对成员的引用的原因-外部对象可以应用状态更改,但是在聚合控制着更改的成员实体的实例生命周期的上下文中。
对于开发丰富而富有表现力的模型而言,不仅可见度,而且与更大范围的实际交互通常是基础。聚合用于控制该访问,但不能完全消除该访问。
我希望这会有所帮助,这是一个很难讨论的概念。
关于java - .NET中的DDD/聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6588792/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!