Beispiel #1
0
        /// <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();
            }
        }