Exemplo n.º 1
0
        public static IServiceCollection ConfigureConfigTypes(this IServiceCollection services, IConfiguration configuration)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            var        assemblies  = DefaultAssemblyLocator.Locate();
            var        configTypes = ConfigSectionAttribute.GetAllAppliedTypes(assemblies);
            MethodInfo method      = typeof(OptionsConfigurationServiceCollectionExtensions)
                                     .GetMethod("Configure", new Type[] { typeof(IServiceCollection), typeof(IConfiguration) });

            foreach (var configTypeInfo in configTypes)
            {
                var configSectionAttribute = configTypeInfo.GetCustomAttribute <ConfigSectionAttribute>();
                var configSection          = configuration.GetSection(configSectionAttribute.SectionName);

                // https://github.com/aspnet/Options/blob/1.0.0-rc2/src/Microsoft.Extensions.Options.ConfigurationExtensions/OptionsServiceCollectionExtensions.cs#L12-L27
                MethodInfo genericMethod = method.MakeGenericMethod(configTypeInfo.AsType());
                genericMethod.Invoke(null, new object[] { services, configSection });
            }

            return(services);
        }
        public static TConfigType GetConfigType <TConfigType>(this IConfiguration configuration)
        {
            var assemblies  = DefaultAssemblyLocator.Locate();
            var configTypes = ConfigSectionAttribute.GetAllAppliedTypes(assemblies);
            var configType  = configTypes.FirstOrDefault(x => x.AsType() == typeof(TConfigType));

            if (configType != null)
            {
                var configSectionAttribute = configType.GetCustomAttribute <ConfigSectionAttribute>();
                var configInstance         = Activator.CreateInstance(typeof(TConfigType));
                var section = configuration.GetSection(configSectionAttribute.SectionName);

                ConfigurationBinder.Bind(section, configInstance);

                return((TConfigType)configInstance);
            }
            else
            {
                throw new InvalidOperationException($"'{typeof(TConfigType).FullName}' is not recognized as a config type.");
            }
        }
        /// <remarks>
        /// For usage of <code>ILibraryManager</code>, see: https://github.com/aspnet/SignalR-Server/blob/dae3e5331081093e038ba0d8bc74ccd8d9046a35/src/Microsoft.AspNetCore.SignalR.Server/Hubs/DefaultAssemblyLocator.cs
        /// </remarks>
        public static IEnumerable <ValidationResult> ValidateConfigTypes(this IConfiguration configuration)
        {
            var assemblies  = DefaultAssemblyLocator.Locate();
            var configTypes = ConfigSectionAttribute.GetAllAppliedTypes(assemblies);

            return(configTypes.Select(configTypeInfo =>
            {
                var configSectionAttribute = configTypeInfo.GetCustomAttribute <ConfigSectionAttribute>();
                var configInstance = Activator.CreateInstance(configTypeInfo.AsType());
                var section = configuration.GetSection(configSectionAttribute.SectionName);

                ConfigurationBinder.Bind(section, configInstance);

                if (configInstance != null)
                {
                    return Validate(configInstance);
                }
                else
                {
                    throw new InvalidOperationException($"No config values for {configTypeInfo.FullName}.");
                }
            }).SelectMany(validationResults => validationResults));
        }
Exemplo n.º 4
0
        public BatchOperationViewModel(OperationModel operationModel, UserControl view) : base(operationModel, view)
        {
#if !DEBUG
            try
            {
#endif

            ConfigSectionAttribute batchAttribute =
                Attribute.GetCustomAttribute(typeof(BatchIOConfigSection), typeof(ConfigSectionAttribute)) as
                ConfigSectionAttribute;
            BatchIOConfigSection batchConfig = new();

            ConfigSections.Add((batchAttribute, batchConfig));

            Items.Add(
                new TabItem
            {
                Header  = batchAttribute?.Name,
                Content = batchConfig
            });

            Operation = Activator.CreateInstance(OperationModel.Type) as IOperation;

            if (Operation is null)
            {
                throw new ArgumentException("Cannot Construct Operation.");
            }

            foreach ((string key, JToken value) in Operation.RequiredConfigSections)
            {
                // Exclude
                if (key == ConfigSectionBase.IOConfigSectionId)
                {
                    continue;
                }

                (ConfigSectionAttribute attribute, ConfigSectionBase section) =
                    PluginService.CreateConfigSection(key, value);

                if (section is null)
                {
                    throw new ArgumentException("Cannot Construct ConfigSection.");
                }

                ConfigSections.Add((attribute, section));

                Items.Add(
                    new TabItem
                {
                    Header  = attribute.Name,
                    Content = section
                });
            }

#if !DEBUG
        }

        catch (Exception)
        {
            Observable.FromAsync(
                () => MessageBox.ShowAndGetResult(
                    "警告",
                    "插件加载出现错误,请检查是否安装了所需的插件。操作可能出现不正常的行为。",
                    view.GetVisualRoot() as Window,
                    false),
                RxApp.MainThreadScheduler)
            .Subscribe(_ => { });
        }
#endif
        }