Pergunta

O princípio por trás do padrão arquitetônico CQS é que você separar suas consultas e comandos em caminhos distintos. Idealmente, o seu armazenamento de persistência pode ser de leitura / gravação particionado, mas no meu caso, não há um único banco de dados, normalizada.

Se você estiver usando um ORM (Hibernate no meu caso), é claro que o ORM é usado quando a emissão de comandos. Mas o que acontece com todas as várias perguntas que você precisa para executar a dados de formas (DTOs) para telas de usuário, é comum a prática de abandonar o ORM ao fazer o lado de Consulta de CQS?

Onde devo implementar minhas consultas e projeções DTO? Hetero ADO.NET (DataReaders, DTOs, DataTables, procedimentos armazenados)? Algumas consultas são bastante originais e envolvem uma série de junções para puxar tudo juntos. Eu não quero desnormalizar o banco de dados para as consultas, mas eu poderia criar visualizações (desnormalização pobre homem).

Foi útil?

Solução

Estou assumindo por CQS você quer dizer o padrão de arquitetura DDD aka CQRS , não estritamente a CQS princípio tradicional.

Eu ainda usar NHibernate para sua leitura único modelo. Há muitas vantagens tais como futuros e multi consultas, preguiçoso / carregamento ansioso etc ... que irão otimizar DB chattiness. Além disso, será mais fácil para consultas compor com um ORM se a interface do usuário permite que o usuário essencialmente alterar a cláusula WHERE.

No que diz respeito a lidar com tecnicamente uma leitura único modelo, você pode marcar uma entidade imutável com NHibernate. Você poderia simplesmente marcar todas as suas entidades do modelo de leitura imutável. Além disso, eu não acho que você pode atualizar projeções em NHibernate modo que é outra opção para ir para a sua leitura único modelo (Alguém por favor me corrija se eu estiver errado, como eu não estou 100% de certeza).

Em relação mapeamentos NH feias ou impossíveis: NH pode mapear para vistas e procedimentos armazenados, então eu acho que seria bom para usar estes quando você precisar. As vistas são provavelmente um pouco mais flexível do que procedimentos armazenados para um cenário somente leitura porque o seu SQL ainda será dinâmico. No entanto, se você precisar de leitura / gravação para qualquer um desses achatada estruturas Eu mapeiam para um procedimento de armazenamento.

Outras dicas

Em última análise, a idéia é que você deve usar o que torna o canal de consulta mais fácil para você construir e manter. Você não precisa mais se preocupar com atualizações, fazer cumprir as regras de negócios, mantendo a integridade dos dados, ou mesmo manipulação de carga (na maior parte). Então você está livre para escolher muitas opções que anteriormente não eram sobre a mesa.

Mas NHibernate ainda pode ser uma boa opção ... é só não é mais o padrão automático (que às vezes é para o lado do comando).

Nós escolhemos usar Castelo Active Record (que se baseia na NHibernate sob o capô), principalmente porque ele tem um bom recurso que irá gerar uma tabela para você a partir de uma classe. Isso se encaixa excelente para nós, porque aqui é o nosso fluxo de trabalho: Primeiro, criamos uma classe ViewModel. Essa classe é formada inteiramente para as necessidades do View. Então, nós marcamos que ViewModel com Castelo Active Record atributos. Então, pedimos Active Record para gerar a tabela correspondente para essa classe no banco de dados de consulta. Esta é a maneira mais rápida, mais suave que encontrei para obter rapidamente uma tabela de banco de dados de consulta que serve a classe ViewModel. A geração automática reflete a realidade de que a única razão pela qual existe a tabela é para servir a vista.

Estamos usando EF para a parte de comando, e em linha reta ADO.NET => DTOs para a cadeia de consulta. Vantagens:

1) Capacidade de consultas otimizar SQL e uso avançado DB loja não apresenta captada em camada ORM

2) Menos sobrecarga

Mas nós estamos usando a separação somente para exigir peças (search), o resto depende de comum modelo Entity Framework.

Não há necessidade de usar uma abordagem diferente para a leitura de seu banco de dados vs. atualizar seu banco de dados. CQS simplesmente afirma que comandos que atualização do armazenamento de dados deve ser separado das consultas que ler o estado do armazenamento de dados.

Você ainda pode usar NHibernate leia o seu armazenamento de dados, mas você pode querer tornar óbvio através da criação de duas classes diferentes de encapsular o seu acesso a dados. Uma classe teria métodos para ler (query) o armazenamento de dados, a outra classe teria métodos para emitir comandos (adicionar, actualizar, apagar) para o armazenamento de dados.

O que você está tentando evitar é um método que recebe uma mensagem do banco de dados e, em seguida, marca a mensagem como lida no banco de dados. Este deve ser duas chamadas de método distintos. Você não deve alterar o estado e devolver um valor a partir do mesmo método.

Eu gosto de manter o ORM separada para leituras e gravações por isso gostaria de usar (e eu uso):

Nhibernate para comandos - lindamente mapeia o meu modelo de domínio

Dapper.net para consultas -. Lindamente mapeia minha DTO e permite felxibility se a consulta é muito complexa

Eles são um casal perfeito assim como Han Solo e Chewbacca.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top