O Service Locator implementa o padrão de localizador e o "padrão" do provedor (alguém verifica se Mark Seemann não teve um derrame;]), mas apesar dos argumentos convincentes que Mark faz contra esses padrões here e aqui Não sei como sair dessa implementação.
A resposta rápida aqui é provavelmente usar um Abstract Factory e remover a dependência do sistema de configuração.
Minhas turmas terão agora 3 dependências de fábrica (uma para cada provedor de dados); isso não é uma grande preocupação, já que meu contêiner DI irá construir meu gráfico de objeto, mas adiciona uma certa quantidade de desordem à classe.
A minha pergunta é: existe um padrão (ou pode ser modificado um dos acima) que me permita a flexibilidade que estou procurando e que não seja tão fedorento ao mesmo tempo que seja amigável com DI?
Coincidentemente, tenho trabalhado em uma situação semelhante ultimamente - longa história: projetar e implementar um Extensão de Processamento de Dados para SSRS que permitiria agregar dados (para relatórios) provenientes de vários tipos de loja: CSV ou JSON localizados no sistema de arquivos ou SQL simples (via System.Data.SqlClient ), ou pontos de extremidade de serviço do WCF, ou algumas interfaces de serviço em processo (através de reflexão padrão), ou algumas outras fontes / formatos mais estranhos.
Eu não tenho IP na fonte, por isso não posso divulgar mais do que o abaixo - se apenas para uma visualização de 20.000 pés, resolvi algo parecido com isto:
Finalmente, embora eu goste deles, não senti a necessidade de introduzir nenhum genérico neste (ainda / se algum).