域驱动设计 – 如何在DDD中实现CQRS的查询端?

前端之家收集整理的这篇文章主要介绍了域驱动设计 – 如何在DDD中实现CQRS的查询端?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用域模型和存储库实现了DDD的命令端,但是如何实现查询方面?

我是否为UI创建了一个全新的领域模型,并且在域层,UI层等中保留在项目结构中的哪里?

另外,作为查询机制使用什么方法,我是否专门为UI域对象创建新的存储库,而不是存储库或别的东西?

从我对CQRS的了解,您将创建一个满足用户界面屏幕或可能需要消费的应用程序需求的DTO。

项目中存在的是基于要求,因为您将通过Web服务公开这些DTO。
在这种情况下,我不会把它放在Web层,而是在应用层或专用的外墙层中。

那么您将拥有只读存储库或数据访问层,直接填充DTO。我认为,查询方面的事情应该被优化为读取性能,在这种情况下,数据库视图或表和sqlDataReaders上的直接查询/存储过程将在这里做最好的工作。但是,这绝对值得抽象出一个接口后面的这个访问,所以你可以在轨道上添加一个缓存的实现。

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

这是一个相当有创意的例子,但我希望它给你一个想法。

  1. public interface ISpecification<T>
  2. {
  3. Expression<Func<T,bool>> Predicate { get; }
  4.  
  5. }
  6.  
  7. public class ActiveCustomeRSSpecification : ISpecification<Customer>
  8. {
  9. private Expression<Func<Customer,bool>> predicate;
  10. public ActiveCustomeRSSpecification()
  11. {
  12. predicate = c => c.IsActive;
  13. }
  14. #region ISpecicfication<Customer> Members
  15.  
  16. public Expression<Func<Customer,bool>> Predicate
  17. {
  18. get { return predicate; }
  19. }
  20.  
  21. #endregion
  22. }
  23.  
  24. public interface IQueryRepository<T>
  25. {
  26. IQueryable<T> GetQuery(ISpecification<T> specification);
  27.  
  28. IEnumerable<T> FindAllBy(ISpecification<T> specification);
  29. }
  30.  
  31.  
  32.  
  33. public class CustomerDtoAssembler
  34. {
  35. public CustomerDto AssembleFrom(Customer customer)
  36. {
  37. var customerDto = new CustomerDto
  38. {
  39. Id = customer.Id
  40. };
  41.  
  42. return customerDto;
  43. }
  44. }

猜你在找的设计模式相关文章