标签: domain-driven-design

CQRS和域模型

我需要使用CQRS实现一个项目,但是我对哪些实体获得相应的命令和查询类有疑问.

如果我有A,B和C类,那么A是我的聚合根,其他是我的聚合中的子实体,哪些类应该有命令和查询类?

我的意思是,我应该有QueryA,QueryB和QueryC,还是应该只有QueryA,例如,它会使用延迟加载来带来子数据?

对于存储库,正如我对域模型的理解,我只考虑RepositoryA(对于我的聚合根).

domain-driven-design repository-pattern cqrs

0
推荐指数
1
解决办法
366
查看次数

正确的例外测试方法

我在一个80%简单逻辑和20%复杂逻辑的项目上做TDD.如果certaing方法抛出错误并想知道正确的方法,我发现自己经常测试.我使用NUnit和JustMock.

我有两种方法可以做到这一点.使用ExpectedException属性,并指定类型.或写作如下.写下面的专业人员是我也可以断言exception.message(如果我已经自定义了),如果测试失败,我也会得到例外消息.但是我想和别人一起检查你是怎么做的.总结一下:

  1. 对这样的异常进行大量测试是否正常?
  2. 这是正确的方法:

只是解释:供应商提供某些合同,部门接受一份合同但不能与同一供应商签订一份以上的合同(但是cource可以与不同的供应商签订不同的合同)

    [Test]
    public void Accepting_more_than_one_contract_from_supplier_throws_exception()
    {
        //Arrange
        var department = new Department(Guid.NewGuid(), "1234");
        var supplier = Mock.Create<Supplier>();
        var contract1 = Mock.Create<DeliveryContract>();
        var contract2 = Mock.Create<DeliveryContract>();
        var id = Guid.NewGuid();
        supplier.Arrange(x => x.Id).Returns(id);
        contract1.Arrange(x => x.Supplier).Returns(supplier);
        contract2.Arrange(x => x.Supplier).Returns(supplier);

        //Act
        department.AcceptContract(contract1);

        //Assert
        try
        {
            department.AcceptContract(contract2);
            Assert.Fail("Duplicate contract with supplier did not throw an exception");
        }
        catch (Exception ex)
        {   
            Assert.AreEqual(typeof(ArgumentException),ex.GetType(),ex.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# tdd nunit unit-testing domain-driven-design

0
推荐指数
1
解决办法
1133
查看次数

如何将项目分为三层?

我有一个asp.net网站,我想把它组织成三层

  1. 数据访问
  2. UI

这些层中的具体内容是什么?

例如

数据 - 模型 - 存储库?这只是接口 - IoC吗?

域名 - 服务?

UI - javascript - 区域特定型号? - css

有人可以提供一个简单的指南来组织这样的asp.net网站吗?

asp.net domain-driven-design data-access-layer organization n-tier-architecture

0
推荐指数
1
解决办法
659
查看次数

什么是聚合的真实世界类比?

当我看看我们的办公室时,我立即想到了一些实体和价值对象.

例如,post-it的一个空帖子肯定是一个值对象,因为它无法与同一个块上的任何其他空帖子区分开来,我根本不关心哪个如果我需要一个空的,我会使用它.

相比之下,我和我的同事肯定是实体,因为我们每个人都有自己的身份.

表可能是实体或值对象,具体取决于您查看它的方式(它是否与任何其他表一样好,或者它是您的表?).

当然,YMMV.

那么,既然我已经找到了对实体和价值对象的一些现实世界的类比 - 那么聚合的类比是什么呢?有吗?

我可以想象,了解聚合实际上是什么有助于理解它背后的概念.

有什么建议?

domain-driven-design

0
推荐指数
1
解决办法
275
查看次数

命令处理程序是否包含服务或服务包含命令?

我试图遵循CQRS模式,但我不知道谁应该包含谁.我应该在命令处理程序上注入应用程序服务,还是反过来呢?

这是一个例子.我正在向命令处理程序注入服务.并使用CreatProductCategoryCommandHandlerExecute方法内的服务

public CreateProductCategoryCommandHandler(ICategoryService categoryService)
{
    _categoryService = categoryService;
}
Run Code Online (Sandbox Code Playgroud)

或者在我有命令处理程序时甚至需要服务?

.net c# asp.net-mvc domain-driven-design cqrs

0
推荐指数
1
解决办法
712
查看次数

重构到域驱动设计

我有一个场景我试图重构DDD.我有一个Batch,它是一个聚合和BatchEntries列表.创建批处理并添加BatchEntries后,将向批处理中的个人发送SMS,并且批处理的状态将从运行更改为已发布.

关于如何使设计更好的任何想法?该域有两个聚合Batch和BatchEntry,Batch是聚合根.

代码看起来像这样

public class Batch : EntityBase, IValidatableObject
{
    public int BatchNumber { get; set; }
    public string Description { get; set; }
    public decimal TotalValue { get; set; }
    public bool SMSAlert { get; set; }
    public int Status { get; set; }

    private HashSet<BatchEntry> _batchEntries;
    public virtual ICollection<BatchEntry> BatchEntries
    {
        get{
            if (_batchEntries == null){
                _batchEntries = new HashSet<BatchEntry>();
            }
            return _batchEntries;
        }
        private set {
            _batchEntries = new HashSet<BatchEntry>(value);
        }
    }

    public static Batch Create(string description, …
Run Code Online (Sandbox Code Playgroud)

c# oop domain-driven-design onion-architecture

0
推荐指数
1
解决办法
680
查看次数

在实际项目中实施DDD的步骤

在引入域驱动设计之后,我意识到DDD专注于业务模型,而不是任何特定的框架/语言/或技术。作为数据驱动型思维定型者(x),我正在努力确定在实际项目中实施DDD的步骤。我想知道实际DDD实施中的实际步骤是什么。例如:

  1. 首先确定业务域模型(?)
  2. 将每个用例,用户案例,业务需求与模型相关联
  3. 使用规定的DDD框架开发解决方案

或者是其他东西 ?

domain-driven-design use-case

0
推荐指数
1
解决办法
1053
查看次数

RESTful创建一个聚合对象

我的网域中有一些Guid二级密钥,我想通过RESTfull从其他域中获取有关这些密钥的更多信息。

public class ProductAggregate
    {
        public Guid Id { get; set; }
        public Guid UserId { get; set; }
        public Guid AgencyId { get; set; }
        public string AgencyTitle { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中AgencyTitle,当前域中不存在此代码,我想通过Restfull从另一个实时服务中获取它,并将聚合的对象发送到客户端。是否可以接受?

domain-driven-design

0
推荐指数
1
解决办法
537
查看次数

事件采购流和聚合的组织

什么是在ES中组织我的事件流的最佳方式.对于事件流,我指的是聚合的所有事件.

鉴于我有project一些数据和一个列表tasks.

现在我有一个GuidAggregateID我的streamID.到目前为止,我可以 - >使用该ID重新创建给定项目的状态 - >我可以projects使用自定义投影组合列表

问题是如何处理todos?这应该在下面处理project stream id还是应该有它自己todo stream id

如果a todo将它分开,将stream如何将其链接到拥有者project.如何project知道todo streams给定的所有内容project.这意味着对项目的所有更改都todo list应该被识别为CommandsEvents(更多事件).

如果我也想在free todo's没有项目关系的情况下允许.是否需要拥有自己的类型并在顶部stream处理freeTodo.而所有的名单todos是否project相关,也将是所有的投影todofreeTodo相关流?

所以我想主要的问题是我如何处理嵌套聚合,以及如何定义事件存储流和链接?

任何提示,技巧,最佳实践或资源将受到高度赞赏.

//编辑更新

首先要感谢@VoiceOfUnreason花时间详细回答这个问题.我添加了标签DDD,因为我有一种奇怪的感觉,它与有界的背景问题相关,这个问题大多数时候都没有黑色或白色的决定.显然,域名有更多的深度和细节,我简化了示例.在下面我分享了一些让我质疑的细节.

在我的第一个想法中,我为todo一个属性定义了一个聚合project id.我将此project属性定义为option …

domain-driven-design cqrs event-sourcing

0
推荐指数
1
解决办法
363
查看次数

DDD:从聚合根访问存储库被视为不良做法?

我已经读过从聚合根访问存储库被认为是不好的做法.如果是,请考虑以下示例:

class User {
   private String username;
   public void changeUsername(String newUsrname) {
     // How will I persist username to database if I don't have access to repository from aggregate root?
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我无法从聚合根访问存储库,我将如何将用户名持久保存到数据库?

我这样看:

class User {
    private String username;
    private UserRepository userRepository;
    public User(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void changeUserName(String newUsername) {
       this.username = newUserName;
       userRepository.save(this); 
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我错过了DDD概念中的一些东西?

java domain-driven-design ddd-repositories aggregateroot

0
推荐指数
1
解决办法
295
查看次数