我需要使用CQRS实现一个项目,但是我对哪些实体获得相应的命令和查询类有疑问.
如果我有A,B和C类,那么A是我的聚合根,其他是我的聚合中的子实体,哪些类应该有命令和查询类?
我的意思是,我应该有QueryA,QueryB和QueryC,还是应该只有QueryA,例如,它会使用延迟加载来带来子数据?
对于存储库,正如我对域模型的理解,我只考虑RepositoryA(对于我的聚合根).
我在一个80%简单逻辑和20%复杂逻辑的项目上做TDD.如果certaing方法抛出错误并想知道正确的方法,我发现自己经常测试.我使用NUnit和JustMock.
我有两种方法可以做到这一点.使用ExpectedException属性,并指定类型.或写作如下.写下面的专业人员是我也可以断言exception.message(如果我已经自定义了),如果测试失败,我也会得到例外消息.但是我想和别人一起检查你是怎么做的.总结一下:
只是解释:供应商提供某些合同,部门接受一份合同但不能与同一供应商签订一份以上的合同(但是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) 我有一个asp.net网站,我想把它组织成三层
这些层中的具体内容是什么?
例如
数据 - 模型 - 存储库?这只是接口 - IoC吗?
域名 - 服务?
UI - javascript - 区域特定型号? - css
有人可以提供一个简单的指南来组织这样的asp.net网站吗?
asp.net domain-driven-design data-access-layer organization n-tier-architecture
当我看看我们的办公室时,我立即想到了一些实体和价值对象.
例如,post-it的一个空帖子肯定是一个值对象,因为它无法与同一个块上的任何其他空帖子区分开来,我根本不关心哪个如果我需要一个空的,我会使用它.
相比之下,我和我的同事肯定是实体,因为我们每个人都有自己的身份.
表可能是实体或值对象,具体取决于您查看它的方式(它是否与任何其他表一样好,或者它是您的表?).
当然,YMMV.
那么,既然我已经找到了对实体和价值对象的一些现实世界的类比 - 那么聚合的类比是什么呢?有吗?
我可以想象,了解聚合实际上是什么有助于理解它背后的概念.
有什么建议?
我试图遵循CQRS模式,但我不知道谁应该包含谁.我应该在命令处理程序上注入应用程序服务,还是反过来呢?
这是一个例子.我正在向命令处理程序注入服务.并使用CreatProductCategoryCommandHandler的Execute方法内的服务
public CreateProductCategoryCommandHandler(ICategoryService categoryService)
{
_categoryService = categoryService;
}
Run Code Online (Sandbox Code Playgroud)
或者在我有命令处理程序时甚至需要服务?
我有一个场景我试图重构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) 在引入域驱动设计之后,我意识到DDD专注于业务模型,而不是任何特定的框架/语言/或技术。作为数据驱动型思维定型者(x),我正在努力确定在实际项目中实施DDD的步骤。我想知道实际DDD实施中的实际步骤是什么。例如:
或者是其他东西 ?
我的网域中有一些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从另一个实时服务中获取它,并将聚合的对象发送到客户端。是否可以接受?
什么是在ES中组织我的事件流的最佳方式.对于事件流,我指的是聚合的所有事件.
鉴于我有project一些数据和一个列表tasks.
现在我有一个Guid是AggregateID我的streamID.到目前为止,我可以 - >使用该ID重新创建给定项目的状态 - >我可以projects使用自定义投影组合列表
问题是如何处理todos?这应该在下面处理project stream id还是应该有它自己todo stream id?
如果a todo将它分开,将stream如何将其链接到拥有者project.如何project知道todo streams给定的所有内容project.这意味着对项目的所有更改都todo list应该被识别为Commands和Events(更多事件).
如果我也想在free todo's没有项目关系的情况下允许.是否需要拥有自己的类型并在顶部stream处理freeTodo.而所有的名单todos是否project相关,也将是所有的投影todo和freeTodo相关流?
所以我想主要的问题是我如何处理嵌套聚合,以及如何定义事件存储流和链接?
任何提示,技巧,最佳实践或资源将受到高度赞赏.
//编辑更新
首先要感谢@VoiceOfUnreason花时间详细回答这个问题.我添加了标签DDD,因为我有一种奇怪的感觉,它与有界的背景问题相关,这个问题大多数时候都没有黑色或白色的决定.显然,域名有更多的深度和细节,我简化了示例.在下面我分享了一些让我质疑的细节.
在我的第一个想法中,我为todo一个属性定义了一个聚合project id.我将此project属性定义为option …
我已经读过从聚合根访问存储库被认为是不好的做法.如果是,请考虑以下示例:
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概念中的一些东西?
c# ×3
cqrs ×3
.net ×1
asp.net ×1
asp.net-mvc ×1
java ×1
nunit ×1
oop ×1
organization ×1
tdd ×1
unit-testing ×1
use-case ×1