Penso que as vantagens desta abordagem superam em muito as desvantagens.
O que você está conseguindo aqui é mais minério menos um perfeito "implementação" do I
na SOLID
por meio do Stairway
padrão - ou seja, sua aplicação depende "para baixo" em uma interface definida no Company.Framework.Persistence.dll
e as próprias implementações individuais também dependem "para cima" nessa abstração.
Isso significa que seu aplicativo está altamente dissociado de todos os detalhes da implementação (é claro que você normalmente desejará compor o gráfico de tempo de execução real usando algum tipo de container IOC). Eu vinculei descaradamente a uma imagem existente desse padrão a partir de outra resposta sobre o assunto. no estouro de pilha:
No livro Código Adaptativo via C #, o autor fala sobre essa abordagem e a chama especificamente de algo que sempre deve ser feito, pois fornece um nível tão alto de dissociação. ( exemplo )
Outra vantagem possível é poder consertar implementações individuais sem se preocupar com o fato de você ter afetado outras pessoas, embora essa seja bastante pequena depois de ter sido diligente com seus testes de regressão; também poder implantar implementações individuais em subpastas, que também podem conter versões específicas de quaisquer dependências de terceiros de que possam precisar, provavelmente ajudará a manter as coisas bem organizadas.
A única desvantagem real que consigo pensar com essa abordagem é que é possível, em teoria, alterar a interface Company.Framework.Persistence.dll
(junto com os binários do aplicativo) e deixar de atualizar as dlls de implementação correspondentes, o que levará a erros de tempo de execução para os usuários.
Tendo sido culpado de fazer exatamente isso no passado, posso dizer que isso é realmente apenas algo que pode acontecer se você for muito descuidado :)