如何限制CQRS中的查询类数?

时间:2014-03-25 08:53:32

标签: c# entity-framework cqrs

我正在实施CQRS,我对查询的查询速度有多困惑。 我也搜索了它,但由于CQRS的各种风味,我没有得到任何适当的解决方案。也许我在这里做错了什么?这是我的代码和各自的查询。

class User {
   public int Id { get; set; }   
   public string Username { get; set; }
   public string Status { get; set; }
   public string Role { get; set; }
   // ...
}

我想通过用户名找到用户,所以我已经为它编写了查询

abstract class Query<TResult> { }
class FindUserByStatusQuery : Query<IEnumerable<User>> {
       public string Status;
}

及其相应的处理程序

interface IQueryHandler<TQuery, TResult> where TQuery : Query<TResult>
{ 
    TResult Handle(TQuery query);     
} 

class FindUserByStatusQueryHandler : IQueryHandler<FindUserByStatusQuery, IEnumerable<User>> 
{
               public IEnumerable<User> Handle(FindUsersByAcountStatusQuery query)
               {   
                   using (Entities db = new Entities()) 
                   {
                      status = query.status.ConvertToString();
                      return db.Users.Where(u =>  u.Status.Contains(status)).ToArray();
                   }
               }
}

现在,我想通过其他字段来查找用户,或者通过ID或多个字段(通过状态和角色)查找用户。可能会有更多类似的查询。

我的问题是我需要为它们创建单独的查询类吗?不会使查询数量相当高吗?我怎么能限制它?

1 个答案:

答案 0 :(得分:7)

我发现最好的方法是务实 - 让查询适合当前情况的背景,除此之外不要考虑。

您说他们可以同时按状态和角色进行查询,因此请在查询对象中包含这两个属性。

如果您在其他地方重复使用查询&#39;在域中,它需要进一步的搜索条件,专门为该域问题创建一个新查询。

摆脱“限制代码”的负担。并分别处理每种情况。创建处理多个域方案的对象会导致复杂性,回归问题和脆弱的类。

提供您的类型a single responsibility