gpt4 book ai didi

domain-driven-design - 如何在 DDD 中实现 CQRS 的查询端?

转载 作者:行者123 更新时间:2023-12-03 15:00:26 26 4
gpt4 key购买 nike

我已经使用域模型和存储库实现了 DDD 的命令端,但是如何实现查询端呢?

我是否为 UI 创建了一个全新的域模型,它保存在项目结构中的什么地方……在域层、UI 层等中?

另外,我使用什么作为我的查询机制,我是专门为 UI 域对象创建新的存储库,而不是存储库,还是其他什么?

最佳答案

根据我对 CQRS 的理解,您将创建一组 DTO,以满足用户界面屏幕或可能需要使用它们的应用程序的要求。

项目中存在的位置取决于要求,因为这取决于您是否要通过 Web 服务公开这些 DTO。
在这种情况下,我不会将它放在 Web 层,而是放在应用程序层或专用的 Façade 层。

然后,您将拥有一个直接填充 DTO 的只读存储库或数据访问层。我认为查询方面应该针对读取性能进行优化,在这种情况下,数据库 View 或表上的直接查询/存储过程和 SqlDataReaders 会在这里做得最好。但是绝对值得将这种访问抽象化到接口(interface)后面,这样您就可以稍后添加一个缓存的实现。

如果您正在使用 ORM 并希望从您的域实体映射到 DTO,那么您可以拥有一个通用的 QueryRepository,它的方法采用 ISpecification 或类似构造来定义您的查询,然后是一个 DtoAssembler 对象,用于从您的域创建 Dto对象。
然后让一个实现为您要执行的每个查询都有一个第一类对象。

这是一个相当人为的例子,但我希望它能给你一个想法。

       public interface ISpecification<T>
{
Expression<Func<T, bool>> Predicate { get; }

}

public class ActiveCustomersSpecification : ISpecification<Customer>
{
private Expression<Func<Customer, bool>> predicate;
public ActiveCustomersSpecification()
{
predicate = c => c.IsActive;
}
#region ISpecicfication<Customer> Members

public Expression<Func<Customer, bool>> Predicate
{
get { return predicate; }
}

#endregion
}

public interface IQueryRepository<T>
{
IQueryable<T> GetQuery(ISpecification<T> specification);

IEnumerable<T> FindAllBy(ISpecification<T> specification);
}



public class CustomerDtoAssembler
{
public CustomerDto AssembleFrom(Customer customer)
{
var customerDto = new CustomerDto
{
Id = customer.Id
};

return customerDto;
}
}

关于domain-driven-design - 如何在 DDD 中实现 CQRS 的查询端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1517033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com