Domain driven design RavenDB加载文档映射到POCO或域聚合根类?

Domain driven design RavenDB加载文档映射到POCO或域聚合根类?,domain-driven-design,ravendb,Domain Driven Design,Ravendb,如果我有这门课: public class Order { public string Id { get; private set; } public DateTime Raised { get; private set; } public Money TotalValue { get; private set; } public Money TotalTax { get; private set; } public List<OrderItem&g

如果我有这门课:

public class Order
{
    public string Id { get; private set; }
    public DateTime Raised { get; private set; }
    public Money TotalValue { get; private set; }
    public Money TotalTax { get; private set; }
    public List<OrderItem> Items { get; private set; }

    public Order(Messages.CreateOrder request, IOrderNumberGenerator numberGenerator, ITaxCalculator taxCalculator)
    {
        Raised = DateTime.UtcNow;
        Id = numberGenerator.Generate();
        Items = new List<OrderItem>();
        foreach(var item in request.InitialItems)
            AddOrderItem(item);
        UpdateTotals(taxCalculator);
    }

    private void AddOrderItemCore(Messages.AddOrderItem request)
    {
        Items.Add(new OrderItem(this, request));
    }

    public void AddOrderItem(Messages.AddOrderItem request, ITaxCalculator taxCalculator)
    {
        AddOrderItemCore(request);
        UpdateTotals(taxCalculator);
    }

    private void UpdateTotals(ITaxCalculator taxCalculator)
    {
         TotalTax = Items.Sum(x => taxCalculator.Calculate(this, x));
         TotalValue = Items.Sum(x => x.Value);
    }
 }
公共类秩序
{
公共字符串Id{get;private set;}
引发的公共日期时间{get;private set;}
公共货币总值{get;private set;}
公共货币总税{get;private set;}
公共列表项{get;private set;}
公共秩序(Messages.CreateOrder请求、IOrderNumberGenerator numberGenerator、ITaxCalculator taxCalculator)
{
Raised=DateTime.UtcNow;
Id=numberGenerator.Generate();
项目=新列表();
foreach(request.InitialItems中的变量项)
AddOrderItem(项目);
更新目录(taxCalculator);
}
私有void AddOrderItemCore(Messages.AddOrderItem请求)
{
添加(新订单项(此,请求));
}
public void AddOrderItem(Messages.AddOrderItem请求,ITaxCalculator taxCalculator)
{
AddOrderItemCore(请求);
更新目录(taxCalculator);
}
私有void UpdateTotals(ITaxCalculator taxCalculator)
{
TotalTax=Items.Sum(x=>taxCalculator.Calculate(this,x));
TotalValue=Items.Sum(x=>x.Value);
}
}
那么这在服务层是否可以接受

Order order = documentStore.Load<Order>(id);
Order=documentStore.Load(id);

我希望每个聚合根有一个类,而不必为了序列化和反序列化而定义一个单独的顺序POCO,只包含属性。请注意,我已将序列化机制更改为包含私有setter。

这很好,Ayende建议将其作为他的第一个技巧

不使用repository模式的论点非常有说服力,当同时使用DDD和RavenDB时,几乎没有理由使用repository模式

我从我的域/应用层直接使用了这种技术,到目前为止,它减少了需要维护的代码量,并使项目更加简单。在使用RavenDB
IDocumentSession
时,我仍然可以得到我的工作单元和一些感觉非常像强类型存储库的东西

我能想到的在RavenDB中保留存储库模式的唯一原因是,在为只读数据创建存储库等时,揭示您的存储库应该被允许做什么的意图。如果您有一种好的通用语言,那么就不需要表示审计条目必须是只读的(业务需求从何而来,以其他方式对其进行编码?)