/// <summary> /// Инициализация фабрики с указанием режима инициализации провайдеров (ленивая или в конструкторе). /// </summary> /// <param name="isLazyProvidersInitialization">Указывает, как именно следует инициализировать провайдеры - во время первого обращения к <see cref="Providers"/> (true) или непосредственно в конструкторе (false).</param> public ProvidersFactoryStartup(bool isLazyProvidersInitialization = true) { AppDomain.CurrentDomain.AssemblyLoad += UpdateProvidersOnAssemblyLoad; _providers = new Lazy <List <TProviderInterface> >(() => { var providers = new List <TProviderInterface>(); if (typeof(TProviderInterface) == typeof(IPoolObject)) { throw new ArgumentException($"Параметр-тип {nameof(TProviderInterface)} не должен совпадать с базовым типом {typeof(IPoolObject).FullName}, должен быть наследником."); } if (!typeof(TProviderInterface).IsInterface) { throw new ArgumentException($"Параметр-тип {nameof(TProviderInterface)} должен быть интерфейсом."); } var types = GetProviderTypesList(); foreach (var type in types) { try { var obj = Activator.CreateInstance(type) as TProviderInterface; if (obj is IPoolObjectInit) { (obj as IPoolObjectInit).Init(); } providers.Add(obj); } catch (Exception ex) { Debug.WriteLine("{0}: provider '{1}' init error: {2}", this.GetType().FullName, type.FullName, ex.Message); } } UpdateProviders(); return(providers); }, true); Init(); if (!isLazyProvidersInitialization) { var f = Providers.AsEnumerable().ToList(); } }