Sobes.tech
Junior — Middle

Qanday yondashuvlar va texnikalarni qo'llaysiz o'z konteyneringizni yaratishda bog'liqliklarni kiritish uchun?

sobes.tech AI

AIdan javob

O'zining dependency injection konteynerini yaratishda quyidagi yondashuvlar va texnikalarni hisobga olish muhim:

  • Dependensiyalarni ro'yxatdan o'tkazish: turlar va ularning implementatsiyalarini ro'yxatdan o'tkazish uchun metodlarni amalga oshirish, masalan, turli hayot aylanishlari bilan (singleton, transient).
  • Dependensiyalarni hal qilish: konteyner obyektlarni yaratishi va ularning dependensiyalarini avtomatik ravishda konstruktor orqali hal qilishi kerak (konstruktor in'ektsiyasi).
  • Rekursiv hal qilish: obyekt yaratishda, konteyner barcha zarur dependensiyalarni rekursiv ravishda yaratishi kerak.
  • Tsiklik dependensiyalarni boshqarish: cheksiz rekursiyadan himoya qilish.
  • Konfiguratsiya: kod yoki konfiguratsiya fayllari orqali dependensiyalarni sozlash imkoniyati.

C# tilida soddalashtirilgan konteyner misoli:

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($"Xizmat {serviceType.Name} ro'yxatdan o'tmagan");

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

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

Ushbu konteyner dependensiyalarni ro'yxatdan o'tkazish va ularning dependensiyalarini avtomatik ravishda yaratish imkonini beradi.