Tag: domain driven design

DDD(java)聚合根和持久性

我正在创建一个应用程序,它将使用各种大小的表格,而我已经开发了一个标记为DDD的项目,之后它没有真正使持久性部分正确,因此我还在研究事物。 我没有完全掌握并且似乎无法找到具体例子的一件事是如何坚持聚集根的“孩子”。 我工作时没有ORM(只是普通的老DAO)很难找到的例子(这实际上是针对uni的项目,这是db特定的所以我’不允许’使用ORM,而我很欣赏这简直太容易了。 我已经四处查看了stackoverflow的具体示例,但似乎没有什么能够描述我的特定问题。 我怀疑下面的代码是对的 public DataTable getTableByID(int id) throws AccessException{ DataTable result = this.context.TableContext().getEntityByID(id); result.setColumns(getColumnsByTableID(id)); return result; } private List getColumnsByTableID(int id){ Object[] arguments = { id }; return this.context.ColumnContext().getUnitsWhere(“TABLE_ID = ?”, arguments); } 如您所见,每次检索表实体时都会设置columns集合,如果表已经在内存中,这显然会丢弃已添加到集合中或从集合中删除的任何列。 我不确定我应该在哪里或如何检索列(我已经考虑过从表类中调用存储库但是对此感觉不舒服)。 说到持久性,我也不完全确定如何去做,当我将对象添加到列表中时我可以很容易地检索它们但是当我删除它们时我真的没有办法检测(因为我是确保把事件赶上来这将是作弊:))。 非常感谢,向正确的方向推进一点点,谢谢。

DDD和应用层

应用程序层(应用程序服务)是否在DDD中添加了@ Stateful,@ Stateless,@ WebService等? 从下面的链接看,这似乎是正确的。 第二个问题:我已经创建了一个存储库类,如果所有涉及存储库的方法调用都是在应用程序服务中进行包装吗 或者我可以直接使用存储库类,比如在JSF中支持bean吗? 何时以及我将什么放在应用程序层中。 我不明白EJB在这个艺术中的位置。 应用层:此层协调应用程序活动。 它不包含任何业务逻辑。 它不保存业务对象的状态,但它可以保持应用程序任务的进度状态。 http://www.infoq.com/articles/ddd-in-practice

命名EJB的本地/远程接口时的标准约定或良好实践?

在为EJB命名接口时是否有任何约定或良好实践? 我正在尝试在我的应用程序中应用一些DDD原则,所以我在类外面使用“服务”类型,这是外部世界的接口。 如果我有一个QuestionService EJB为客户端提供业务逻辑操作,那么@ Local / @ Remote接口的名称是什么? 到目前为止我读过的所有书籍都只将它们命名为QuestionServiceLocal / QuestionServiceRemote。 这是否足够(我不想尝试命名,但我想知道是否有更好的命名约定)? 另外,在应用程序中命名“服务”的其他/更好的方法是在每个类上添加“… Service”后缀吗?

单一责任原则如何与贫富/富域模型相关联?

目前正在对从另一个团队接管的内容进行一些代码审查,并对使用SRP及其与贫血或富域模型(由Martin Fowler定义)的关系存在疑问。 丰富的域模型概念是拥有智能对象,不仅可以设置/获取其属性,还可以执行更复杂的业务逻辑。 我喜欢它如何融入SRP? 假设我的模型类有一些属性可以暴露这些道具并提供一些简单的计算。 下一个要求是有可能将此对象数据存储在一些不受我控制的存储对象中,如下所示: class MyObject { // get set // parse sth } 存储方法存储 storage.store(key, object); 如果MyObject具有这样的存储方法,它是否违反了SRP public void store(Storage storage) { storage.store(‘keyOne’, fieldOne); storage.store(‘keyTwo’, fieldTwo); } 从这个对象的pov来看,能够存储其状态是一个很好的想法。 其他方式可能是在这里介绍一种服务,并这样做: public StorageService { private Storage; // constructor here …. public void store(MyObject myobj); } 你能指点一下我能读到的关于这个问题的链接吗? 我在这里找到了一个关于SO的post,但它没有完全回答我的问题。 如何在DDD中解决? 根据定义,DDD中的模型很丰富,可以看作具有太多责任。

使用JPA / Spring的(通用)DDD存储库的方法:它看起来不对吗?

我对DDD和JPA很新。 我正在使用JPA和Spring开发通用存储库。 我非常喜欢文章DDD中公开的方法:通用存储库和JPA实现模式:数据访问对象 。 我的目标是使用JPA和Spring在域驱动设计中构建完美的存储库。 在第一篇文章概念之后,我使用内部通用存储库来尊重域与数据存储的契约 。 public interface IInternalGenericRepository { List read(String query, Object[] params); void persist(E entity); void remove(E entity); } public class InternalGenericRepository implements IInternalGenericRepository { // Injected through DI in Spring @PersistenceContext private EntityManager em; private final Class entityClass; public List read(String query, Object[] params) { Query q = em.createQuery(query); for […]

是否有丰富的域模型示例?

我正在寻找一个简单的例子来说明使用丰富域模型的好处。 理想情况下,我想要一个前后代码列表(应该尽可能短)。 前面的代码清单应该显示使用贫血域模型解决的问题,以及许多相当程序化的服务层代码,后面的代码清单应该显示使用丰富的面向对象的域模型解决的相同问题。 理想情况下,代码清单应该是Java或Groovy,但任何相似的东西(例如C#)都可以。

过滤存储库或服务中的对象?

我想根据一些参数得到一个对象列表。 该对象是否属于特定类别,它是否具有属性xyz等。我创建了一个相当简单的存储库,通过id获取对象。 如果我想要一个基于不同参数和标准的对象列表,你会在存储库中添加一个方法,或者在服务层中有一个方法继续运行,直到它有一个符合标准的对象列表? 它只是使用存储库get by id方法并针对许多标准进行检查?

ORM /如何处理Domain对象和Persistent对象之间的对应关系?

在应用程序中,至少有两种方法可以处理域对象持久性和ORM。 使用某种ORM(xml或注释)直接将域对象映射到持久性 在域和持久模型之间存在大量阻抗不匹配的情况下分离关注点 (表格列)。 这意味着,域对象是持久性不可知的,并且对某些对应的持久对象进行了一些转换,后者映射到ORM。 正如纯DDD开发人员所知,域不应该由您的数据库需求驱动 ,因此在我的项目中,我使用这种关注点分离。 有人会想到YAGNI,有人会说“很棒”(就像这里一样)。 根据我对可重用性的需求,我的项目需要一些不同的数据库,因此我选择了我的域模型和持久模型之间的关注点分离。 但是我遇到了Spring-Data的一个问题(某种性能损失)。 一个细节可能,但只是假设一个ORM不具有merge的function,或任何相关的,以将分离的实体重新附加到当前事务。 为了理解,让我们假设这个概念代码(用Java): @Transaction public void participateToMeeting(String userId, String meetingId){ User user = userRepository.ofId(userId); //returns a User domain type Meeting meeting = meetingRepository.ofId(meetingId); //returns a Meeting domain type if(user != null && meeting != null) { user.participate(meeting); // as attached entity, this would automatically persist the […]

域驱动设计 – 父子关系模式 – 规范模式

我想知道在处理父母子女关系时,以下哪项被认为是最佳做法。 1)以下示例似乎是一种常见做法,但在创建子实例时,只要未添加到父级,它就处于无效状态。 这不能导致validation等问题。 public class Parent { private ICollection children; public ReadOnlyCollection Children { get; } public void AddChild(Child child) { child.Parent = this; children.Add(child); } } public class Child { internal Parent Parent { get; set; } public Child() { } } 2)下一个样本会注意孩子必须始终与其父母有关。 public class Parent { private ICollection children; public ReadOnlyCollection Children { […]

是否可以一起使用DDD和BDD?

我喜欢用DDD实现的中间开发。 开发是由域,应用程序中最可靠的部分驱动的。 我们不依赖于基础设施,持久性和演示。 听起来不错。 但它没有商业价值。 这是以业务为中心的BDD与外部开发。 我们没有前期域设计(选择实体,值对象,聚合)。 我们收集用户故事,编写一些场景并逐个实现。 我们从应用程序的最多变的部分开始开发 – 从演示开始。 我讨厌写脆弱的验收测试。 你呢? 所以,如果有人在这里有关于在BDD风格中应用DDD的成功故事,请与我分享一些:) 你是否为了演示而编写那些脆弱的测试? 在为实现的用户故事创建域的一部分之前,您是否预先设计了一些设计? 或者你在实施故事后重构DDD模式? 任何帮助将不胜感激。 谢谢!