Sobes.tech
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);
    }
}

Такой контейнер позволяет регистрировать зависимости и автоматически создавать объекты с их зависимостями.