Sobes.tech
Junior — Middle

Que abordagens e técnicas irá aplicar ao criar o seu próprio contêiner para injeção de dependências?

sobes.tech IA

Resposta da IA

Ao criar o seu próprio contêiner para injeção de dependências, deve considerar as seguintes abordagens e técnicas:

  • Registo de dependências: implementar métodos para registar tipos e as suas implementações, por exemplo, com diferentes ciclos de vida (singleton, transitório).
  • Resolução de dependências: o contêiner deve ser capaz de criar objetos, resolvendo automaticamente as suas dependências através do construtor (injeção por construtor).
  • Resolução recursiva: ao criar um objeto, o contêiner deve criar recursivamente todas as dependências necessárias.
  • Tratamento de dependências cíclicas: prever proteção contra recursão infinita.
  • Configuração: possibilidade de configurar dependências através de código ou ficheiros de configuração.

Exemplo de um contêiner simplificado em C#:

public class SimpleContainer
{
    private readonly Dictionary<Type, Type> _registrations = new();

    public void Register<TService, TImplementation>()
    {
        _registrations[typeof(TService)] = typeof(TImplementation);
    }

    public TService Resolve<TService>()
    {
        return (TService)Resolve(typeof(TService));
    }

    private object Resolve(Type serviceType)
    {
        if (!_registrations.ContainsKey(serviceType))
            throw new Exception($"Serviço {serviceType.Name} não registado");

        var implementationType = _registrations[serviceType];
        var constructor = implementationType.GetConstructors().First();
        var parameters = constructor.GetParameters()
            .Select(p => Resolve(p.ParameterType))
            .ToArray();

        return Activator.CreateInstance(implementationType, parameters);
    }
}

Este contêiner permite registar dependências e criar automaticamente objetos com as suas dependências.