问题标签 [domain-driven-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
orm - 连接表中带有额外列的多对多映射
这是我希望拥有的域:
这是我拥有的架构:
这是一个人为的架构和域,但它与我正在使用的东西几乎相同。我目前通过编写第三个域实体来表示 CertificatesAcquiredByPeople 表,但这对我来说真的很奇怪。
我将如何使用 NHibernate 映射它?我相信 hbm 文件中的组件标签应该做我想要的,但我不太明白。
我的域是否因为我的证书类上有一个 DateAcquired 属性而出现问题?日期实际上只是拥有证书的人的关注点。
[编辑]
我现在更改了域模型以反映需要一个新实体。现在对于映射,我需要 3 个(对于每个实体)映射,还是可以使用 2 个(对于人员和证书)进行映射?
c# - 从数据库中创建域对象的快速/正确方法
我在数据库中有典型的表,如用户、用户组,它们有关系。
在我的域模型中,我希望如果您请求用户,您将获得用户并且每个用户都拥有属于的属性,这意味着这些是他所属的组。在属性中我想要组列表(作为组的类型安全)
另一方面也应该这样做,这意味着每个组都应该知道哪些用户属于该组。
我有这个类(示例):
现在,实现它的最佳方法是什么,以及填充所有对象的最快方法是什么。
顺便说一句:我正在使用亚音速来获取所有数据库记录(对于每个表一个选择)。至少有 1500 个用户和 30 个组。
我当前的代码基于组的foreach,组的relationship.where,然后users.singleordefault 来查找用户,然后将用户添加到组,将组添加到用户。但它需要大约 30 秒才能做到这一点。
我的客户端应用程序是一个 web 应用程序,所以我将结果存储在一个缓存的存储库中,这就是我这样做的原因!!
domain-driven-design - 合并两个域对象
在我正在处理的项目中,我们有一个聚合域对象。工厂对象处理对象唯一 ID 的创建。但是有一个单独的导入过程,它最初创建没有 id 的相同对象。要将导入的对象添加到系统中,我们现在被迫逐个字段地复制到一个新对象,因为出于显而易见的原因,我们不能只为其设置 id。任何人都可以提出更好的方法来处理这种情况吗?
.net - 识别 DDD 有界上下文和构建项目
我试图了解领域驱动设计,我看到的例子似乎很有意义,但我仍然不确定如何将它们应用于我的具体情况。
我正在设计一个用户可以发布/编辑文章的 CMS。然后其他用户可以查看这些内容,他们也可以发表评论、添加标签等。我的问题是,在这种情况下,有界上下文是什么。您可以将用户视为“内容创建者”或“内容用户”。
就项目结构而言,我计划拥有例如 Project.Data(模型类)、Project.Services、Project.Repositories 等。这都是以数据为中心的,我是否应该通过它们所在的有界上下文来拆分它们。如果是这样,您如何处理文章等共享对象?
像往常一样,当您尝试了解新概念时,这些示例非常有意义,直到您尝试将这些想法应用于实际情况。
任何指针或有用的链接都会很棒。
谢谢,
c# - MVC 和观察者模式
我在我的项目中实现观察者模式时遇到问题。该项目必须在 C# 中制作为 MVC,就像 Windows 应用程序一样。
在我的域模型中,我有例如 Country 类和 Country 存储库。我有一个国家控制器和视图,用于查看所有国家(表格上的列表)、添加新国家和编辑现有国家。
我不知道有多少观点必须了解与国家变化相关的变化。问题是我必须使用观察者模式。在网络上,我只能找到主题是国家和观察者是编辑国家的表单并且所有示例都在控制台应用程序中的示例。
我需要所有包含国家/地区列表的表格都知道添加新国家/地区,而不仅仅是编辑现有国家/地区。我应该怎么做,我应该将存储库设为主题吗?
design-patterns - 您使用工厂而不是构造函数来创建对象的阈值是多少?
您使用工厂而不是构造函数来创建对象的阈值是多少?
- 你总是使用工厂。
- 仅当您有除检查空值之外的不变检查时,您才使用工厂。
- 你总是使用构造函数
- 你很少使用工厂......那些情况是什么?
利弊
更新:我在我的项目中应用域驱动设计的工厂模式。创建工厂的原因之一是减少领域模型中的噪音。
谢谢
linq-to-sql - 与 DDD、存储库模式和相关领域模型作斗争
我真的很难理解这些东西。让我举一个我在哪里挣扎的例子。
我使用 Linq-2-Sql 作为我的应用程序的 DAL,以及 Rob Conery 的 MVC Storefront 示例应用程序中使用的 IRepository 模式。
在我的域中,我有一个包含地址模型集合的客户模型。在我的 UI 中有一个按钮,允许用户向客户添加新地址。这会打开一个地址编辑器,让他们填写所有信息。
接下来发生什么?地址是否保存到数据库中,然后添加到我的客户对象的列表中?它只是被添加到列表中,但在保存 Customer 对象之前不会更新?如果用户想删除一个地址怎么办?我是否删除数据库中的地址,然后将其从列表中删除?还是他们只是进行他们想要的所有删除/添加,我每次都从数据库中转储所有内容并使用 Customer.Addresses 集合中的任何内容进行更新?这里的正确流程是什么?
地址的集合是否应该只通过存储库通过调用这样的东西来更新:
帮助...
design-patterns - DDD - 值对象与。实体对象
我是 DDD 的新手,并努力理解一些概念。您如何确定在您的域中哪些对象是 Entity 对象,哪些是 Value 对象,以及它们究竟是如何区别对待的?
architecture - 领域模型 - 标识符关系与分层对象
在充实一个假设的域模型时,我发现自己想知道关联域对象的更好方法是让父域对象包含一个指针(子域的标识符),还是使用子对象在父对象内构建复合。
我可以看到每种方法的优缺点,主要是大小与复杂性之间的权衡,归根结底。我倾向于更多地倾向于标识符关系方法,因为我没有预料到需要进行任何类型的延迟加载。
尽管不直接相关,但域对象是简单的 POCO(POJO 的 .NET 等效项)。它们被明确标记为可序列化,因为它们很有可能最终会在应用程序域之间交叉。在我看来,LINQ 使关系标识符方法可行,如果 LINQ 不可用,我根本不会考虑它。
任何想法将不胜感激!
编辑:还有一些想法可能让我倾向于仅使用标识符的方法。首先是对象的缓存策略。父对象和子对象完全有可能具有不同的 TTL,这由它们的策略定义。第二个是引用持有可能会限制对象重用,因为同一个孩子可能被多个父母持有——在可重用数据的情况下。这两者也与序列化对象的整体大小有关。
domain-driven-design - Antlr 是 DSL 生成器还是有意编程的替代品?
Charles Simonyi 首先是在微软,然后是在他自己的公司,努力建立意向编程领域的雄心和创造力让我印象深刻。
http://en.wikipedia.org/wiki/Intentional_programming
在这种软件方法中,程序员首先构建一个特定于给定问题域(例如人寿保险)的工具箱。领域专家在程序员的帮助下,然后以所见即所得 (WYSIWYG) 的方式描述程序的预期行为。自动化系统使用程序描述和工具箱来生成最终程序。后续更改仅在 WYSIWYG 级别进行。
它似乎是一种非常有用且实用的编程方法,可能会规避当前软件开发方法的许多问题。
从本质上讲,它似乎有助于非程序员(业务/系统分析师)创建特定领域的语言,但在一个比 UML 所能提供的更接近实际实现的阶段。他说它最终会完成,但它还没有(大约 15 年后)。
DSL 涵盖了从简单的 5 行规则引擎到 Ruby on Rails 等复杂应用程序的所有领域。所以我认为延迟发布他的产品与他正在处理简化更高级别的抽象这一事实有关,因为他必须基本上允许同时封装所有领域语言。
所以,我的问题是
(a) Antlr是否可以替代意向编程——尽管可能是一个不太用户友好的替代方案,需要程序员的干预而不是允许业务分析师生成 DSL? 您可以使用 Antlr 生成像 Ruby on Rails 这样的 DSL(假设它支持 Ruby 作为输出 - 我认为它不支持)?它不能做什么?另外,我不明白为什么它被称为“语言解析器”而不是“语言生成器”——因为后者描述了它的用途,而前者描述了它如何实现最终结果。
和
(b) 如果 Antlr 和 Intentional Programming 不同,有没有类似 Intentional Programming 的东西?