Junior — Middle
Welche Ansätze und Techniken wenden Sie bei der Erstellung Ihres eigenen Containers für die Dependency Injection an?
sobes.tech KI
Antwort von AI
При создании собственного контейнера для внедрения зависимостей стоит учитывать следующие подходы и техники:
- Регистрация зависимостей: реализовать методы для регистрации типов и их реализаций, например, с разными жизненными циклами (singleton, transient).
- Разрешение зависимостей: контейнер должен уметь создавать объекты, автоматически разрешая их зависимости через конструктор (конструкторная инъекция).
- Рекурсивное разрешение: при создании объекта контейнер должен рекурсивно создавать все необходимые зависимости.
- Обработка циклических зависимостей: предусмотреть защиту от бесконечной рекурсии.
- Конфигурация: возможность конфигурировать зависимости через код или конфигурационные файлы.
Пример упрощённого контейнера на 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($"Service {serviceType.Name} not registered");
var implementationType = _registrations[serviceType];
var constructor = implementationType.GetConstructors().First();
var parameters = constructor.GetParameters()
.Select(p => Resolve(p.ParameterType))
.ToArray();
return Activator.CreateInstance(implementationType, parameters);
}
}
Такой контейнер позволяет регистрировать зависимости и автоматически создавать объекты с их зависимостями.