Pergunta

Eu pensei que eu iria reescrever esta questão (a mesma iteração). O original era como quebrar um padrão de repositório em torno de um banco de dados EAV / CR. Eu estou tentando uma abordagem diferente.

Pergunta: Como você pode codificar um repositório de dados de uma forma padrão de design "fábrica" ?? Eu tenho um número fixo de entidades, mas os atributos para essas entidades são bastante específica do cliente. Eles anunciam os produtos que são todos semelhantes, mas cada cliente atribui informações diferentes para eles com base em seu modelo de negócio. Por exemplo, alguns cuidados sobre a laje por cento off resíduos enquanto outros se preocupam com a quantidade de libras vendidas. Toda vez que encontrar um outro cliente, nós adicionamos um monte de campos, remover um monte de campos, e em seguida, passar horas mantendo cada corrente solução para a última versão comum.

Eu pensei que poderia colocar as classes de repositório em um padrão de fábrica, de modo que quando eu sei o tipo de cliente, então eu sei o que campos que usariam. Prático? Melhor maneira? Os formulários web usar controles de usuário que são modificados para refletir o que os campos estão nas layouts. Atualmente, "juntar" os campos encontrados no layout para os campos encontrados na tabela de produtos, em seguida, campos CRUD comuns.

Anterior conteúdo questão :

Temos um modelo de dados EAV / CR que permite que classes diferentes para a mesma entidade. Este rastreia produtos onde os clientes têm produtos muito diferentes. Os clientes podem definir uma "classe" de produto, carregá-lo com campos, em seguida, preenchê-lo com dados. Por exemplo,

Product.Text_Fields.Name
Product.Text_Fields.VitaminEContent

Qualquer sugestão sobre como quebrar um padrão de repositório de contornar isso?
Temos um EAV três tabela: a tabela de Produtos, uma tabela de valores, e uma mesa meta que lista os nomes de campo e tipos de dados (que lista os tipos de dados, porque temos outras tabelas como dados Product.Price e Product.Price Meta, junto com outros como Product.Photo.) os clientes acompanhar todos os tipos de preços, como por cento de um concorrente fora diferença, bem como sobre os cálculos de voar.

Atualmente, utilizamos o LINQ to SQL com C #.

Editar:

Eu gosto da "Consulta dinâmica" Linq abaixo. A idéia por trás da nossa DB é como um armazenamento armário vestiário. Cada atleta (ou cliente) organiza seu próprio armário da maneira que desejarem, e lidamos com guardá-la por eles. Nós não nos importamos o que está no armário, enquanto eles podem fazer o que precisa com ele.

Muito interessante ... Os objetos passados ??para o repositório poderia ser dinâmico? Isso quase faz sentido, quase como um padrão de fábrica. Seria possível para o cliente a colocar suas próprias definições de classe em um arquivo de texto, em seguida, nós herdamos-los e armazená-los no banco de dados?

Foi útil?

Solução

Como eu entendo o padrão de repositório abstrai a implementação física do banco de dados a partir da aplicação. Você está planejando para armazenar os dados em diferentes armazenamentos de dados? Se você está feliz com o LINQ to SQL, então eu sugiro que talvez você não precisa de abstrair dessa maneira como ele parece ser extremamente complexa. Dito isto, eu posso ver que o fornecimento de um repositório de estilo EAV, ou seja, uma consulta que precisam ser passadas de mesa, tipo de campo, e Nome do campo junto com qualquer condicional necessário, pode oferecer-lhe a abstração você está procurando.

Eu não tenho certeza se isso ainda poderia ser considerado um padrão de repositório em termos mais estritos que você não está realmente abstrair o armazenamento do aplicativo. Vai ser uma disputa acirrada entre benefício e esforço e lá eu sou incapaz de ajuda.

Você pode querer dar uma olhada nas extensões Dinâmico Linq encontrado na visualização de dados dinâmicos no Codeplex.

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