Tag: domain driven design

我应该使用AutoFixture来测试我的洋葱的核心元素,它没有依赖性吗?

这个问题来自我之前的问题: 如何使用OneTimeSetup? 特别是回答者之一的回答。 请参阅以下代码: [TestFixture] public class MyFixture { IProduct Product; [OneTimeSetUp] public void OneTimeSetUp() { IFixture fixture = new Fixture().Customize(new AutoMoqCustomization()); Product = fixture.Create(); } //tests to follow } AutoMoq仅用于创建模拟吗? 我问的原因是因为我之前正在阅读一个问题,其中回答者暗示它也用于创建普通类型,即不是模拟。 我想测试我的Onion的Core元素,它没有依赖关系。 因此我应该使用AutoFixture吗?

这是DTO的正确使用吗?

我正在编写一个控制台应用程序,它可以从存储过程记录集中进行大量数据检索。 对于我正在使用的每个记录集类型,我有一个使用EF和自定义复杂类型的Repository来检索数据: public interface IBalanceSheetRepository { IEnumerable GetBalanceSheetRecords(); } public class BalanceSheetRepository : IBalanceSheetRepository { DBContext _context; … public IEnumerable GetBalanceSheetRecords() { ObjectResult results = _context.GetBalanceSheet(); return results.Select(CreateBalanceSheetDTOFromDAO); } private static BalanceSheetRecordDTO CreateBalanceSheetDTOFromDAO(BalanceSheetRecord dao) { return new BalanceSheetRecordDTO { … }; } } 这里, BalanceSheetRecord是我在设计器中创建的复杂数据类型。 我创建了一个DTO以避免耦合,因为BLL不应该知道BalanceSheetRecord类型。 这是我的问题:由于DTO类型用于存储库接口的方法签名,并且由于我的BLL最终将使用存储库并返回DTO的集合,因此它似乎是一个跨领域的问题。 因此,我让DTO与repo接口一起生活在一个单独的“Infrastructure”组件中。 这是我努力实现的良好做法,还是我在某个地方转错了? 另外:在我的存储库中新建数据上下文是不好的做法? 当两个组件都属于DAL时,是否有一定数量的耦合? 我想使用DI,但是对于替换TestBalanceSheetRepository的repo的DBContext实现似乎更有用。

业务对象或实体应该自我validation吗?

Business Objects的validation是一个常见问题,但有一些解决方案可以解决这个问题。 其中一个解决方案是使用独立的NHibernate.Validator框架,这是一个基于属性的validation框架。 但我正面临着概念上的担忧。 像NH.Validator这样的属性validation器很棒,但只有在Session中的save-update-delete时才会执行validation。 所以我想知道业务对象是否不应该自我validation以保持自己的完整性和一致性?

NHibernate映射与类层次结构,其基类是抽象的,鉴别符不是字符串

以下是域模型类: public abstract class BaseClass { … } public class ChildClass : BaseClass { … } 请注意,父类是抽象的,这使得我在使用流畅的nhibernate进行映射时遇到了一些困难。 我的鉴别器是一个字节(DB中的tinyint)。 因为它不是一个字符串而我无法在基类上设置一个鉴别器值,所以这不起作用(取自BaseClass的映射类): DiscriminateSubClassesOnColumn(“Type”) .SubClass() .IsIdentifiedBy((byte)OperationType.Plan) .MapSubClassColumns(p => { … }) 我得到的错误信息是: 类初始化方法UnitTest1.MyClassInitialize引发exception。 NHibernate.MappingException:NHibernate.MappingException:无法将鉴别器值格式化为实体的SQL字符串BaseClass —> System.FormatException:输入字符串格式不正确.. 以下post似乎解释了会发生什么。 他们给出了一个xml的解决方案,但没有流利的nhibernate: http : //forum.hibernate.org/viewtopic.php? t = 974225 谢谢您的帮助。

架构:简单的CQS

我正在考虑将CQS应用于我的ASP.NET MVC网站,但这非常简单。 我不是指CQRS,因为我想为查询和命令部分使用相同的数据源,因此我不需要事件源和其他更复杂的模式。 所以,我想到的是: 使用相同的数据库进行查询和命令部分 对于查询部分,使用entity framework和WCF数据服务公开数据库视图,以便将特定视图返回给客户端,查询数据变得非常容易 对于命令部分,使用entity framework和单向WCF服务公开数据库表,并使用DDD原则。 我想要实现的主要是: 由单向服务操作执行并由富域模型处理的简单命令,客户端只需传递执行命令所需的数据 灵活查询简单视图,专为客户端的特定UI设计 这有意义吗?

DDD:持久化之前的实体身份

在域驱动设计中,实体的一个定义特征是它具有身份。 问题: 我无法在实例创建时为实体提供唯一标识。 一旦实体被持久化(此值由底层数据库提供),此标识仅由存储库提供。 此时我无法开始使用Guid值。 现有数据与int主键值一起存储,我无法在实例化时生成唯一的int。 我的解决方案 每个实体都有一个标识值 一旦持久化(由数据库提供),身份仅设置为真实身份 在持久性之前实例化时,标识设置为默认值 如果标识是默认标识,则实体可通过引用进行比较 如果标识不是默认标识,则实体可通过标识值进行比较 代码(所有实体的抽象基类): public abstract class Entity { private readonly IdType uniqueId; public IdType Id { get { return uniqueId; } } public Entity() { uniqueId = default(IdType); } public Entity(IdType id) { if (object.Equals(id, default(IdType))) { throw new ArgumentException(“The Id of a Domain Model […]

如果您被迫使用Anemic域模型,那么您在哪里放置业务逻辑和计算字段?

我们当前的O / RM工具并不真正允许丰富的域模型,因此我们不得不在各地使用贫血(DTO)实体。 这工作得很好,但我仍然在努力放置基于对象的基本业务逻辑和计算字段。 当前图层: 介绍 服务 知识库 数据/实体 我们的存储库层具有大多数基本的提取/validation/保存逻辑,尽管服务层执行了许多更复杂的validation和保存(因为保存操作也执行日志记录,权限检查等)。 问题是在哪里放置这样的代码: Decimal CalculateTotal(LineItemEntity li) { return li.Quantity * li.Price; } 要么 Decimal CalculateOrderTotal(OrderEntity order) { Decimal orderTotal = 0; foreach (LineItemEntity li in order.LineItems) { orderTotal += CalculateTotal(li); } return orderTotal; } 有什么想法吗?

工作单元和存储库模式对大型项目非常有用吗?

我正在使用ASP.NET Webforms + EF4开始一个新的Web项目。 我正在尝试按照本教程应用具有工作单元模式的存储库模式: http : //www.dotnetage.com/publishing/home/2011/07/05/6883/the-repository-pattern-with-ef -code先dependeny喷射在-ASP净mvc3.html 我想我有了这个想法,但我的问题是,当我在模型中创建一个新对象时,我是否还必须在工作单元的IDALContext中定义该对象? 这不是一个快速发展的手? 此外,如果您与多个开发人员合作,并且如果您不希望其他开发人员看到您的DAL,您如何管理它? 因为在我理解的这种模式中,当你在模型中创建一个新对象时,你还必须在本教程的IDALContext中定义它。 对不起,我对此很困惑。

如何从存储库中检索域对象

我对存储库域对象关系有一点了解。 以下是我对域名设计所了解的一些信息(它们可能也是错误的或不准确的)。 考虑到这些,我找不到从存储库中获取域对象的方法。 在DDD中,域名应该只知道并包含业务所需的内容,其他所有内容都必须从域中清除。 没关系。 而且,从任何企业抽象数据访问也是一种很好的做法。 应用程序不需要知道我们存储数据的位置或存储数据的方式。 我们只要求存储库给我们一个域对象,它为我们提供了我们想要的对象,或者另一种方式也是有效的,我们给存储库一个域对象并将其发送到存储。 在面向对象设计中声明域对象的公共setter也是一种非常糟糕的方法,因为我们无法控制谁访问了什么并改变了什么。 因此,仅展示对象外部所需的内容是一种很好的做法。 因此,在我的脑海中,我无法找到实现我的存储库的方法。 我可以在我的代码中使用任何ORM或纯sql并检索数据。 但我无法从持久性对象创建域对象; 由于他们没有公共设置器,我无​​法创建和设置字段值。 声明包含所有字段的公共构造函数似乎不正确。 我可能有几个模型要填写,这意味着我必须定义几个具有不同参数集的构造函数。 任何帮助将不胜感激…

DDD – 如何实现高性能的搜索存储库

我有关于DDD和存储库模式的问题。 假设我有Customer聚合根的Customer存储库。 Get&Find方法返回完全填充的聚合,其中包括Address等对象。一切都很好。 但是当用户在UI中搜索客户时,我只需要聚合的“摘要” – 只是一个包含汇总信息的扁平对象。 我可以解决这个问题的一种方法是正常调用存储库中的find方法,然后在应用程序层中将每个客户聚合映射到CustomerSearchResult / CustomerInfo DTO,并将它们发送回客户端。 但我的问题是性能; 每个Customer聚合可能需要多个查询来填充所有关联。 因此,如果我的搜索条件与50个客户相匹配,那么对于可能检索数据的数据库而言,这是我非常不需要的。 另一个问题是,我可能希望包含有关客户聚合根边界之外的客户的汇总数据,例如最后订单的日期。 订单有自己的聚合,因此要获取客户的订单信息,我必须调用OrderRepository,这也会降低性能。 所以现在我觉得我有两种选择: 向CustomerRepository添加一个额外的Find方法,该方法通过执行一个有效的查询来返回这些摘要对象的列表。 创建一个专门构建的只读CustomerInfoRepository,它只有1中描述的find方法。 但这两种感觉都让我觉得我违背了DDD的原则。 我的存储库inheritance自通用基础:存储库,其中T:IAggregateRoot。 这些摘要信息对象不是聚合,并且与T的类型不同,所以#1真的违背了设计。 也许对于#2,我会创建一个没有IAggregateRoot约束的抽象SearchRepository? 我的域名中有许多类似的场景。 你会如何实现这种情况? 谢谢,戴夫 更新 在阅读Theo的答案之后,我想我会选择#2选项并在我的基础架构中创建一个专门针对这些场景的SearchRepository。 然后,应用程序层(WCF服务)可以调用这些直接填充摘要DTO的存储库,而不是将域实体映射到DTO。 ****更新2 **** 虽然我在一年前问过这个问题,但我想我只是补充一点,因为我发现了CQRS,旨在解决这个问题。 Udi Dahan( http://www.udidahan.com/ )和Greg Young( http://codebetter.com/gregyoung/ )已经写了很多关于它的文章。 如果您使用DDD创建分布式应用程序,CQRS适合您!