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.