Esse design é ruim? Como pode ser melhorado?

9

Escrevi o seguinte há um tempo, mas vim para revê-lo recentemente e agora não acho que seja um bom design.

O design é para um tipo de camada de banco de dados modular usando o Entity Framework 4. Há um único objeto de banco de dados que carrega (preguiçosamente) contextos de estrutura de entidade de bibliotecas externas em um local especificado, e as instâncias dos contextos carregados são armazenadas em uma tabela de hash contra seu nome (por exemplo, "ContentMgmtContext").

Todo contato com o banco de dados neste sistema é através de procedimentos armazenados. Para fazer uma chamada ao banco de dados, a assinatura do método de consulta é semelhante a esta:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

Essa modularidade é algo que eu gosto. No entanto, há uma desvantagem significativa nessa abordagem: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.no modelo, os objetos da camada de banco de dados são convertidos em novos objetos que a visualização e o controlador usam.

Eu acho que esse é um design ruim, mas como posso melhorá-lo? Eu considerei adicionar uma interface vazia IStoredProecedureObjectpara fornecer a todos os tipos de dados retornados por um procedimento armazenado um tipo de base comum, no entanto, isso parece frustrado pelo Entity Framework. Sempre que o .edmxarquivo é recompilado, o código é gerado novamente e as adições removidas. Existe alguma maneira de impedir que isso aconteça?

Como posso melhorar esse design? O que (mais) há de errado com isso? Ou estou no caminho certo?

Andy Hunt
fonte

Respostas:

6

Isenção de responsabilidade: Eu não uso a estrutura de entidades e sou fortemente influenciado por praticamente qualquer estrutura auxiliar de banco de dados.

Parece que você criou um invólucro.

Eu faço uma distinção entre "wrapper" e "layer". Camada sendo algo que você pode compilar com sua própria DLL / projeto / Jar / qualquer coisa. A camada de acesso a dados. O invólucro é uma classe "auxiliar" que você usa nessa DLL. Com o objetivo de simplificar a interface, ou talvez eliminar a duplicação.

O problema com a simplificação da interface de acesso ao banco de dados é que geralmente não é simples. Você acaba duplicando a interface do ADO / JDBC / etc. Ou você força as pessoas a ignorá-lo. Os invólucros tendem a fazer todo tipo de coisas indesejadas. Eles podem fechar automaticamente uma conexão quando você precisar dela aberta para suportar uma transação. Eles geralmente deixam as conexões abertas por engano, se você tiver que transmitir dados, e estão usando um desses idiomas de coleta de lixo. Para fornecer todo o poder da biblioteca por trás do seu wrapper, você é obrigado a duplicá-lo.

Bibliotecas como ADO / JDBC já são uma ótima interface. Eles são alguns dos melhores exemplos de POO feitos corretamente. Eu preferiria usá-los sobre um invólucro que alguns wizbang tiraram do chapéu.

A interface clássica do estilo JDBC / ADO é bem conhecida e compreendida. O invólucro que você tirou do chapéu não é.

Deseja reduzir "parâmetros.Add" redundantes? Olhe para os genéricos. Ou simplesmente aceite que, ao tentar reduzir o "paramter.Add", você simplesmente envia o ".add" para outra camada de código.

BTW, esta é uma ótima pergunta. Eu votaria 10 vezes se pudesse.

Editar: É claro que o código JDBC ficaria oculto na camada de acesso a dados.

Lord Tydus
fonte
Eu concordo, em retrospectiva, que isso é mais um invólucro do EF 4 do que ele próprio. A idéia por trás disso era permitir que diferentes partes da conectividade do banco de dados (como um modelo de dados padrão) fossem reutilizadas, além de ter um único ponto de entrada para vários bancos de dados, cada um com a característica de reutilização. Esse wrapper de banco de dados é compilado em uma biblioteca separada (junto com outra lógica de negócios). Como você sugere que eu mude meu design para melhorá-lo?
Andy Hunt
+1 para o ótimo conteúdo, apesar do seu viés EF ... embora o EF seja mais do que uma estrutura auxiliar de banco de dados. Você está certo sobre ele tentar fazer um invólucro para isso.
SoylentGray