Back to questions
Junior — Middle
71
Какие подходы и техники вы примените при создании собственного контейнера для внедрения зависимостей?
Answer from AI
sobes.tech 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);
}
}
Такой контейнер позволяет регистрировать зависимости и автоматически создавать объекты с их зависимостями.