Eu acho que sua premissa é um pouco confusa aqui, você fala em injetar uma fábrica, mas o padrão de fábrica é um padrão criacional cujo objetivo era fazer um subconjunto do que uma estrutura de injeção de dependência faz, quando as estruturas de DI não eram predominantes. útil por esse motivo. No entanto, se você tiver uma estrutura de DI, não precisará mais de uma fábrica, pois ela pode cumprir o propósito que a fábrica teria cumprido.
Dito isto, deixe-me explicar um pouco sobre a injeção de dependência e como você geralmente a usaria.
Existem várias maneiras de fazer injeção de dependência, mas as mais comuns são injeção de construtor, injeção de propriedade e DIContainer direto. Vou falar sobre a injeção de construtores, pois a injeção de propriedades é a abordagem errada na maioria das vezes (a abordagem correta algumas vezes), e o acesso ao DIContainer não é preferível, exceto quando você absolutamente não pode fazer nenhuma das outras abordagens.
A injeção de construtor é onde você tem a interface para uma dependência e um DIContainer (ou fábrica) que conhece a implementação concreta dessa dependência e onde quer que você precise de um objeto que depende dessa interface, no momento da construção, você entrega a implementação da fábrica para isto.
ie
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
Muitas estruturas de DI podem simplificá-lo significativamente para onde o DIContainer inspecionará o construtor do UserRepository em busca de interfaces para as quais ele conhece implementações concretas, e automaticamente as entregará para você; Essa técnica é freqüentemente chamada de Inversão de controle, embora DI e IoC sejam termos que se intercambiam muito e têm diferenças vagas (se houver).
Agora, se você está se perguntando como o código abrangente acessa o DIContainer, bem, você pode ter uma classe estática para acessá-lo ou o mais apropriado é que a maioria das estruturas de DI permita que você crie um DIContainer, em que ele realmente se comportará como um wrapper para um dicionário singleton interno para os tipos que ele sabe serem concretos para determinadas interfaces.
Isso significa que você pode atualizar o DIContainer em qualquer lugar que desejar no código e obter efetivamente o mesmo DIContainer que você já configurou para conhecer seus relacionamentos entre interface e concreto. Um meio usual de ocultar o DIContainer de partes do código que não devem interagir diretamente com ele é simplesmente garantir que apenas os projetos necessários tenham uma referência à estrutura de DI.