Tag: domain driven design

如何为分层数据结构定义DDD聚合根?

我目前正在尝试将领域驱动设计原则应用于我的开发实践。 我一直坚持如何为层次结构中组织的数据定义聚合根。 让我们以文件夹结构为例 – 每个文件夹可以有0..N子文件夹,子文件夹0..N也可以有0..N子文件夹,依此类推。 我在一个文件夹上有不变量,所有它的直接和间接子文件夹 – 删除文件夹应该导致删除它的所有子文件夹 那将是DDD有效方法让我们说聚合根“文件夹层次结构”,它包含1个“文件夹”实体(即该文件夹层次结构的“标题”文件夹),每个文件夹实体具有0..N文件夹实体(sub -folders) 那是一个有效的DDD吗? 这会有效吗? 由于我已经读过DDD主张拥有小聚合,但是这个“文件夹层次结构”可能是一个巨大的聚合… 具有深层次结构的聚合根是否适合DDD? Vaughn Vernon的有效集合设计 任何建议如何使这两个DDD有效和有效? 编辑 让我们有一个具有树状结构的对象的不同示例。 假设我需要开发一个任务跟踪系统,并且该系统需要任务使子任务具有非固定级别 – 所有任务都是从function/行为角度来看 – 每个任务可以有0..1父任务和0。 .N儿童任务。 将Task作为聚合根(具有所有它的子任务层次结构)不会遵循DDD建议的小聚合 – 对吗? 根据DDD原则, Task的优秀设计是什么? 如果Task (带有它的层次结构)不是aggegate,如何在Task上实现不变量(包含所有它的子任务层次结构)?

EF 6:映射复杂类型集合?

EF 6(代码优先)是否支持复杂类型集合(Value Object集合)映射? 我知道它支持复杂类型,但还没有找到一个我们有一组复杂类型的例子。 例如,假设您有一个名为Student的实体,它有一组联系人。 对于NH,我可以简单地说学生有一组联系人,而联系人是一个组件(相当于ef中的复杂类型)。 这可以通过EF完成而不改变与实体的联系吗?

应该从服务层返回什么类型的结果?

比方说,我有一个创建post的PostsService : public class PostsService : IPostsService { public bool Create(Post post) { if(!this.Validate(post)) { return false; } try { this.repository.Add(post); this.repository.Save(); } catch(Exception e) { return false; } } } 这样做的问题是,如果在存储库操作期间抛出exception,则会被吞下。 Create()返回false ,消费者知道的所有内容都是没有添加Post ,但不知道原因 。 相反,我想到了一个ServiceResult类: public class ServiceResult { public bool Success { get; private set; } public Exception Exception { get; private […]

使用域驱动设计与entity framework聚合根

我正在使用使用Entity Framework的Domain Driven Design构建应用程序。 我的目标是允许我的域模型(通过EF持久化)包含一些逻辑。 开箱即用,entity framework对于如何将实体添加到图形然后保持不变非常不受限制。 举例来说,我的域名为POCO(没有逻辑): public class Organization { private ICollection _people = new List(); public int ID { get; set; } public string CompanyName { get; set; } public virtual ICollection People { get { return _people; } protected set { _people = value; } } } public class Person { […]

DDD:用户聚合根与其他聚合中的几乎所有实体之间的一对多关系

我有以下DDD方案,分为以下聚合: 用户, 朋友(用户协会), 文件(用于用户上传), 画廊(文件分组), 消息(用户通信), 组(用户可以创建和其他成员可以加入), GroupMessages(发送给组中所有成员的消息), GroupForums(小组成员可以讨论各种主题) 这是令人困惑的地方。 用户与GroupForums之间的所有内容相关联。 通过用户存储库访问其他聚合似乎是不合逻辑的,但从级联的角度来看,如果我从技术上删除了用户,那么与用户关联的记录也应该消失。 似乎我不应该将这里存在的所有一对多关联添加到用户实体,因为从数据库中保湿似乎是荒谬的,特别是如果我尝试拉动与用户相关联的每个记录。 组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法?

没有ORM的存储库模式

我在不使用ORM的.NET C#应用程序中使用存储库模式。 但是,我遇到的问题是如何填充实体的一对多列表属性。 例如,如果客户有一个订单列表,即如果Customer类有一个名为Orders的List属性,而我的存储库有一个名为GetCustomerById的方法,那么? 我应该在GetCustomerById方法中加载Orders列表吗? 如果订单本身有另一个列表属性等等怎么办? 如果我想做懒加载怎么办? 我在哪里将代码加载到客户的Orders属性? 在Orders属性中获取{} accessor? 但那时我必须将存储库注入域实体? 我不认为这是正确的解决方案。 这也引发了诸如变更跟踪,删除等function的问题? 所以我认为最终结果是我可以在没有ORM的情况下进行DDD吗? 但是现在我只对我的域实体中的延迟加载List属性感兴趣? 任何的想法? 纳比勒 我假设对于没有在域驱动设计中使用ORM的人来说,这是一个非常常见的问题? 任何的想法?

是否存在在基于DDD的分层体系结构中的模型和数据访问层之间使用LINQ的建议模式

我一直在阅读Tim McCarthy 关于.NET中DDD的精彩书籍 。 在他的示例应用程序中,他的基础数据访问是使用SqlCE并且他手工编写SQL内联。 我一直在使用一些模式来利用Entity Framework,但我已经陷入了如何将IRepository linq查询映射到底层数据访问层的问题。 我有一个名为的具体存储库实现。 public EFCustomerRepository : IRepository { IEnumerable GetAll( Expression<Func> predicate) { //Code to access the EF Datacontext goes here… } } 在我的EF模型中,我正在使用POCO实体,但即便如此,我的DomainEntity.Customer和我的DataAccessLayer.Customer对象之间也没有本地映射。 所以我不能只将Expression<Func> predicate作为EFContext.Customers.Where(…);的参数EFContext.Customers.Where(…); 是否有一种简单的方法来映射Expression<Func> predicate => Expression<Func> predicate 或者我这样做错了吗? 任何建议/指针赞赏。

TDD,DDD和封装

经过几年跟随我工作地点的“建筑师”传下来的不良做法并认为必须有更好的方法,我最近一直在阅读TDD和DDD,我认为原则和实践将是一个非常适合我们编写的软件的复杂性。 但是,我见过的许多TDD示例都在域对象上调用一个方法,然后测试对象的属性以确保正确执行行为。 另一方面,业内几位受人尊敬的人(Greg Young最着名的是关于CQRS的讨论)主张通过删除所有“getters”来完全封装每个域对象。 因此,我的问题是:如果禁止检索域状态,如何测试域对象的function? 我相信我错过了一些基本的东西所以请随时称我为白痴并启发我 – 任何指导都将不胜感激。

使用EF Code First的DDD – 如何将它们组合在一起?

我正在学习DDD开发几天,我开始喜欢它了。 我(我想)理解DDD的原理,你的主要关注点是业务对象,你有聚合,聚合根,聚合根源的存储库等等。 我正在尝试创建一个简单的项目,我将DDD开发与Code First方法结合起来。 我的问题是:(我使用的是asp.net MVC) DDD Business Objects将与Code First对象不同? 即使它们可能是相同的,例如我可以拥有一个具有所有规则和方法的Product业务对象,并且我可以拥有一个Product code first(POCO)对象,它只包含我需要保存在数据库中的属性。 如果问题1的答案是“真”,那么我如何通知Product POCO对象业务对象Product的属性已被更改,我必须更新它? 我正在使用“AutoMapper”或类似的东西? 如果答案是“不”,我就完全迷失了。 你能告诉我一个最简单的(CRUD)例子,我怎么能把这两个放在一起? 谢谢

C#MongoDB:如何正确映射域对象?

我最近开始阅读Evans的Domain-Driven设计书,并开始了一个小样本项目,以获得DDD的一些经验。 同时我想了解更多有关MongoDB的知识,并开始用MongoDB和最新的官方C#驱动程序替换我的SQL EF4存储库。 现在这个问题是关于MongoDB映射的。 我看到用公共getter和setter映射简单对象非常容易 – 没有痛苦。 但是我在没有公共设置者的情况下映射域实体有困难。 据我所知,构建有效实体的唯一真正干净的方法是将所需的参数传递给构造函数。 请考虑以下示例: public class Transport : IEntity { private readonly TransportID transportID; private readonly PersonCapacity personCapacity; public Transport(TransportID transportID,PersonCapacity personCapacity) { Validate.NotNull(personCapacity, “personCapacity is required”); Validate.NotNull(transportID, “transportID is required”); this.transportID = transportID; this.personCapacity = personCapacity; } public virtual PersonCapacity PersonCapacity { get { return personCapacity; } } […]