Olá pessoal.
Há algum tempo atrás eu havia perguntado
aqui a respeito da existência de um ORM que fosse baseado em
RoleInterfaces.
Em resumo para quem não leu (Se tiverem lido e quiserem passar pro restante do email, pulem o trecho identado):
Apresentei um modelo de acesso a dados que eu tenho, onde um único repositório é usado para todos os objetos do meu modelo e coordena internamente os repositórios da aplicação, que são baseados em Interfaces, ou seja, 1 Interface para cada Tabela, 1 Repositório para cada Interface. Eles recebem os objetos, verificam se são responsáveis pela persistência deles através de sua interface e assumem o controle.
A implementação disso foi bastante divertida, mas, como podem imaginar, levou bastante tempo para atingir uma certa maturidade. E finalmente agora que está madura, estamos pensando em refatorar.
A idéia inicial é clara: Queremos suportar LINQ (por que está sendo muito ruim ter que implementar novos métodos para cada novo filtro que nos vem em mente, como SelectByDate(datetime From, datetime til) e SelectByCategory(Category Category)...)
Estou entre dois dilemas, me divertir refazendo isso (desta vez tentando torná-lo reutilizável para aproveitar nos projetos futuros) ou me deixá-lo como está e me divertir implementando o IQueryable<>, foi por isso que escrevi naquele período.
Mas eu percebi que estava fazendo a pergunta errada. E talvez, agora, pensando melhor, eu consiga expressar o que realmente queira alcançar. Por que fizemos tudo aquilo em primeiro lugar? Fácil, por que tentamos encontrar uma forma de fazer com que nossos modelos (OO e Relacional) não se interferissem. Tabelas normalizam dados e Classes normalizam comportamento. Assim, classes diferentes que compartilham parte de sua estrutura de dados precisam persistí-los na mesma tabela... Não sei como é nos sistemas que vocês normalmente implementam, mas no nosso, esse compartilhamento de de estrutura acontece em diversos pontos do sistema e buscamos uma solução que tentasse fazer com que as tabelas interferissem no modelo OO e vice-versa.
Por este motivo, coloquei as estruturas de dados das tabelas em interfaces nomeadas de acordo com o seu contexto e fiz com que minhas classes implementassem estas interfaces e whallah... atingimos o objetivo. Foi nos sugerido diversas outras formas de fazê-lo, como criar classes de objetos que iriam compor o objeto no modelo OO (o que faria com que o relacional interferisse no design das classes), e nós estamos decididos a tentar encontrar uma solução que continue nos apontando para o objetivo, e é este objetivo que forma a pergunta certa a ser feita:
Como implementar um modelo de objetos que não interfira o modelo Relacional, usando o RepositoryPattern? Eu já coloquei na minha cabeça que talvez a solução seja estudar melhor o tão falado DDD (do qual já li um bocado mas nunca me aprofundando muito por ter que dar prioridade a outras coisas) e, talvez, o Giovanni tenha algo a dizer a respeito. Então, é claro, me comprometo a estudar a respeito disso e talvez, assim, já obter a resposta para a pergunta. Mas, mesmo assim, gostaria de levantar esta discussão. Acredito que ela tem tudo a ver com o contexto do grupo. Acredito que ela só tem a somar para todos os participantes ou, no mínimo, servir de bom exercício para aqueles que já dominem as técnicas usadas para atingir este objetivo.
Usando ORM ou não, eu gostaria de propor a elaboração de um modelo de acesso a dados que seguisse esta premissa (OO X relacional sem se inteferirem). Talvez eu descubra que isso não é nenhum bixo de 7 cabeças (e fique com cara de idiota afterall, hehehe), talvez todos nós descubramos que não existe uma forma elegante e reutilizável de se implementar isso ou ainda, talvez, descubramos uma oportunidade, como comunidade de arquitetos, de contribuir com uma nova técnica, um novo pattern, para a comunidade de desenvolvimento em geral (não esquentem, geralmente eu sou meio utópico). Independente da conclusão, acho que todos temos a ganhar com isso, quer seja conhecimento, quer seja experiência.
O que acham?
Atenciosamente,
Daniel Moreira Yokoyama.
"I am putting myself to the fullest possible use, which is all I think that any conscious entity can ever hope to do."
(HAL 9000)