Database 领域驱动设计(DDD)和数据库生成的报告

Database 领域驱动设计(DDD)和数据库生成的报告,database,domain-driven-design,persistence,Database,Domain Driven Design,Persistence,我仍在调查DDD,但我很想知道一个潜在的陷阱 根据DDD,聚合根不应该知道持久性,但这不意味着整个聚合根最终都会在内存中实例化吗 例如,如果聚合根不应该知道持久性,它如何要求数据库对大量数据进行分组和求和 根据DDD,聚合根不应该知道持久性,但这不意味着整个聚合根最终都会在内存中实例化吗 聚合根是一致性边界,因此您通常会将整个聚合加载到内存中以强制执行不变量。如果这听起来像是一个问题,那么这可能暗示您的聚合太大,可能需要重构 例如,如果聚合根不应该知道持久性,它如何要求数据库对大量数据进行分组和

我仍在调查DDD,但我很想知道一个潜在的陷阱

根据DDD,聚合根不应该知道持久性,但这不意味着整个聚合根最终都会在内存中实例化吗

例如,如果聚合根不应该知道持久性,它如何要求数据库对大量数据进行分组和求和

根据DDD,聚合根不应该知道持久性,但这不意味着整个聚合根最终都会在内存中实例化吗

聚合根是一致性边界,因此您通常会将整个聚合加载到内存中以强制执行不变量。如果这听起来像是一个问题,那么这可能暗示您的聚合太大,可能需要重构

例如,如果聚合根不应该知道持久性,它如何要求数据库对大量数据进行分组和求和

聚合不会要求数据库对数据进行分组和求和-通常您会在应用程序服务/命令处理程序中加载聚合。例如:

public class SomeUseCaseHandler : IHandle<SomeCommand>
{
    private readonly ISomeRepository _someRepository;
    public SomeUseCaseHandler(ISomeRepository someRepository)
    {
        _someRepository = someRepository;
    }

    public void When(SomeCommand command)
    {
        var someAggregaate = _someRepository.Load(command.AggregateId);
        someAggregate.DoSomething();
        _someRepository.Save(someAggregate);
    }
}
公共类SomeUseCaseHandler:IHandle
{
私有只读异构存储库;
公共SomeUseCaseHandler(异构存储库someRepository)
{
_someRepository=someRepository;
}
当(SomeCommand)时公共无效
{
var someaggregate=\u someRepository.Load(command.AggregateId);
DoSomething();
_someRepository.Save(someAggregate);
}
}
因此,您的聚合仍然忽略它是如何持久化的。但是,您的异构位置实现并不是无知的,因此您可以做任何必要的事情来完全加载聚合。因此,在加载聚合时,您可以拥有持久性实现组/总和,但更常见的情况是,您可能会查询读取模型:

public class SomeUseCaseHandler : IHandle<SomeCommand>
{
    private readonly ISomeRepository _someRepository;
    private readonly ISomeReadModel _someReadModel;

    public SomeUseCaseHandler(ISomeRepository someRepository, ISomeReadModel readModel)
    {
        _someRepository = someRepository;
        _someReadModel = someReadModel;
    }

    public void When(SomeCommand command)
    {
        var someAggregaate = _someRepository.Load(command.AggregateId);
        someAggregate.DoSomethingThatRequiresTheReadModel(_someReadModel);
        _someRepository.Save(someAggregate);
    }
}
公共类SomeUseCaseHandler:IHandle
{
私有只读异构存储库;
私有只读模型_someReadModel;
公共SomeUseCaseHandler(异构存储库someRepository,异构模型readModel)
{
_someRepository=someRepository;
_someReadModel=someReadModel;
}
当(SomeCommand)时公共无效
{
var someaggregate=\u someRepository.Load(command.AggregateId);
someAggregate.dosomethingthat requiresthereADModel(_someReadModel);
_someRepository.Save(someAggregate);
}
}
不过,您实际上还没有说您的用例是什么。:)

[更新]

刚刚注意到标题是指数据库生成的报告-这根本不会经过您的域模型,它将是一个完全独立的读取模型。CQRS在这里适用

根据DDD,聚合根不应该知道持久性,但这不意味着整个聚合根最终都会在内存中实例化吗

聚合根是一致性边界,因此您通常会将整个聚合加载到内存中以强制执行不变量。如果这听起来像是一个问题,那么这可能暗示您的聚合太大,可能需要重构

例如,如果聚合根不应该知道持久性,它如何要求数据库对大量数据进行分组和求和

聚合不会要求数据库对数据进行分组和求和-通常您会在应用程序服务/命令处理程序中加载聚合。例如:

public class SomeUseCaseHandler : IHandle<SomeCommand>
{
    private readonly ISomeRepository _someRepository;
    public SomeUseCaseHandler(ISomeRepository someRepository)
    {
        _someRepository = someRepository;
    }

    public void When(SomeCommand command)
    {
        var someAggregaate = _someRepository.Load(command.AggregateId);
        someAggregate.DoSomething();
        _someRepository.Save(someAggregate);
    }
}
公共类SomeUseCaseHandler:IHandle
{
私有只读异构存储库;
公共SomeUseCaseHandler(异构存储库someRepository)
{
_someRepository=someRepository;
}
当(SomeCommand)时公共无效
{
var someaggregate=\u someRepository.Load(command.AggregateId);
DoSomething();
_someRepository.Save(someAggregate);
}
}
因此,您的聚合仍然忽略它是如何持久化的。但是,您的异构位置实现并不是无知的,因此您可以做任何必要的事情来完全加载聚合。因此,在加载聚合时,您可以拥有持久性实现组/总和,但更常见的情况是,您可能会查询读取模型:

public class SomeUseCaseHandler : IHandle<SomeCommand>
{
    private readonly ISomeRepository _someRepository;
    private readonly ISomeReadModel _someReadModel;

    public SomeUseCaseHandler(ISomeRepository someRepository, ISomeReadModel readModel)
    {
        _someRepository = someRepository;
        _someReadModel = someReadModel;
    }

    public void When(SomeCommand command)
    {
        var someAggregaate = _someRepository.Load(command.AggregateId);
        someAggregate.DoSomethingThatRequiresTheReadModel(_someReadModel);
        _someRepository.Save(someAggregate);
    }
}
公共类SomeUseCaseHandler:IHandle
{
私有只读异构存储库;
私有只读模型_someReadModel;
公共SomeUseCaseHandler(异构存储库someRepository,异构模型readModel)
{
_someRepository=someRepository;
_someReadModel=someReadModel;
}
当(SomeCommand)时公共无效
{
var someaggregate=\u someRepository.Load(command.AggregateId);
someAggregate.dosomethingthat requiresthereADModel(_someReadModel);
_someRepository.Save(someAggregate);
}
}
不过,您实际上还没有说您的用例是什么。:)

[更新]

刚刚注意到标题是指数据库生成的报告-这根本不会经过您的域模型,它将是一个完全独立的读取模型。CQRS在这里适用

根据DDD,聚合根不应该知道持久性,但这不意味着整个聚合根最终都会在内存中实例化吗

哦,不,比那更糟;整个聚合(根和所有从属实体)在内存中被实例化加载。本质上,根据定义,您需要加载所有状态以验证任何更改

例如,如果聚合根不应该知道持久性,它如何要求数据库对大量数据进行分组和求和

这样做不需要聚合根

域模型的主要作用是确保所有写入都尊重您的业务,从而确保记录簿的完整性。读,就像数据库报告一样,我