Sei que a ideia é explicar o conceito, mas chega um ponto que a interface IQuery e ICommand vão ter métodos que talvez eu não queira implementar. Tomando por base o exemplo das categorias, se eventualmente eu não quiser trazer só uma especifica e o que importa é só ter a lista dela, a interface IQuery teria que ser alterada novamente para atender esse meu caso específico. Nesse caso, teria que criar um IQueryList e um IQueryOne (algo assim) e faria o IQuery extender de IQueryList e IQueryOne pra não afetar as demais partes do sistema.
Uma sugestão de abordagem que eu sigo nesse caso é criar uma classe abstrata de Repository (RepositoryBase) com os métodos basico de CRUD, e simplesmente extendo dessa classe e declaro os métodos que eu preciso na interface do repository que estou implementando.
public class CategoriaRepository : RepositoryBase<Categoria>, ICategoriaRepository {}
public interface ICategoriaRepository
{
IEnumerable<Categoria> ObterTodos();
}
public abstract class RepositoryBase<TEntidade>
where TEntidade : EntidadeBase
{
// Implementação dos métodos de CRUD
}