Qual deles você prefere para procurar / Relatórios DataTable ou DTO ou classe de domínio?

StackOverflow https://stackoverflow.com/questions/392806

Pergunta

O projeto atualmente estou trabalhando em requer muita searhing páginas / Filtering. Por exemplo, eu tenho uma página de pesquisa comlex para obter Questões de dados, categoria, unidade, ...

questão de classe de domínio é complexo e contém grande quantidade de objetos de valor e objetos filho.

.Eu estou querendo saber como as pessoas lidam com a procura / Filtering / Relatório para o UI. Tanto quanto eu sei que tem 3 opções, mas nenhum deles me fazer mais feliz.

1.) Enviar parâmetros para Repositório / DAO Chegar DataTable e Bind DataTable a UI Controls.For Exemplo para ASP.NET GridView

DataTable dataTable =issueReportRepository.FindBy(specs);
.....
grid.DataSource=dataTable;
grid.DataBind();

Nesta opção que eu posso simplesmente passar a camada de domínio e consulta de banco de dados para especificações dadas. E eu não tenho que ficar totalmente construído objeto de domínio complexo. Não há necessidade de objetos de valor, objetos filho, .. Obter dados para exibido na interface do usuário no DataTable diretamente do banco de dados e mostrar na interface do usuário.

Mas se tem que mostrar um campo calculado na UI como valor de retorno do método que eu tenho que fazer isso no banco de dados, porque eu não tenho totalmente objeto de domínio. Eu tenho que duplicar lógica e DataTable problemas como nenhum intellisense etc ...

2.) parâmetros enviar para o Repositório / DAO Chegar DTO e Bind DTO a controles de interface do usuário.

IList<IssueDTO> issueDTOs =issueReportRepository.FindBy(specs);
....
grid.DataSource=issueDTOs;
grid.DataBind();

Nesta opção é o mesmo que, como acima, mas eu tenho que criar objetos DTO anêmica para cada página de pesquisa. Também para diferentes páginas de pesquisa problema que tenho para mostrar diferentes partes do Issue Objects.IssueSearchDTO, CompanyIssueTO, MyIssueDTO ....

3.) Enviar parâmetros para a classe Repository real para obter totalmente construído objetos de domínio.

IList<Issue> issues =issueRepository.FindBy(specs);
//Bind to grid...

Eu gosto de Domain Driven design e padrões. Não há lógica DTO ou duplicação neste option.but nesta opção eu tenho que criar o lote de criança e objeto de valor que não vai mostrados na UI.Also que exige muito do ob juntar-se para obter objeto de domínio completo e custo de desempenho para agulhas criança objetos e objetos de valor.

Eu não uso qualquer ferramenta ORM Talvez eu possa implementar Lazy Loading à mão para esta versão mas parece um pouco exagero.

Qual deles você prefere? Ou eu estou fazendo errado? Existem quaisquer sugestões ou melhor maneira de fazer isso?

Foi útil?

Solução

Eu tenho algumas sugestões, mas é claro que a resposta geral é "depende".

Em primeiro lugar, você deve usar uma ferramenta ORM ou você deve ter uma razão muito boa para não ser fazê-lo.

Em segundo lugar, a implementação Lazy Loading à mão é relativamente simples assim, no caso de que você não vai usar uma ferramenta ORM, você pode simplesmente criar propriedades de seus objetos que dizem algo como:

private Foo _foo;
public Foo Foo
{  
  get {  
         if(_foo == null)
         {
            _foo = _repository.Get(id);
         }
         return _foo;
       }
}

Em terceiro lugar, o desempenho é algo que deve ser considerado, inicialmente, mas não deve levá-lo longe de um design elegante. Eu diria que você deve usar (3) inicialmente e só desviar-lo se seu desempenho é insuficiente. Isso resulta em escrever a menor quantidade de código e ter o mínimo de duplicação em seu projeto.

Se sofre de desempenho que você pode dirigir-se facilmente na camada de interface do usuário usando o cache e / ou na sua camada de domínio usando Lazy Loading. Se estes dois não conseguem proporcionar um desempenho aceitável, então você pode cair de volta para uma abordagem DTO onde você só passar de volta uma coleção leve de valor objetos necessários.

Outras dicas

Esta é uma grande pergunta e eu queria dar a minha resposta também. Eu acho que o tecnicamente melhor resposta é ir com a opção # 3. Ele fornece a capacidade de melhor descrever e organizar os dados juntamente com escalabilidade para futuras melhorias para relatar / pesquisar pedidos.

No entanto , enquanto este pode ser o geral melhor opção, há um enorme custo IMO contra os outros (2) opções que são o tempo de design adicionais para todas as classes e relacionamentos necessários para apoiar o relatando necessidades (novamente sob a premissa de que não há nenhuma ferramenta ORM sendo usado).

I luta com isso em um monte de minhas aplicações, bem como a realidade é que # 2 é o melhor compromisso entre o tempo e design. Agora, se você estava perguntando sobre seus objetos Busniess e todas as suas necessidades existe não pergunta que um modelo totalmente definidos e devidamente projetado é importante e não há substituto. No entanto, quando se trata de relatar e procurando isso para mim é um animal diferente. # 2 fornece dados fortemente tipado nas classes anêmicos e não é tão primitivo como valores codificados em conjuntos de dados como # 1, e ainda reduz consideravelmente a quantidade de tempo necessário para completar o projeto em comparação com # 3.

Idealmente, eu gostaria de estender o meu modelo de objeto para abranger todas as necessidades de relatórios, mas às vezes o esforço necessário para fazer isso é tão extensa, que a criação de um conjunto separado de aulas apenas para relatar necessidades é uma opção mais fácil, mas ainda viável. Na verdade, eu perguntei quase esta pergunta idêntica alguns anos atrás e também foi dito que a criação de um outro conjunto de classes (essencialmente DTOs) para relatar necessidades não foi uma má opção.

Assim, para envolvê-lo, # 3 é tecnicamente a melhor opção, mas # 2 é provavelmente a opção mais realista e viável quando se considera o tempo e qualidade juntos para relatórios complexos e pesquisar necessidades.

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