Ejemplo n.º 1
0
        public static IDataBuilder AddData <TDependency>(this IExtensionBuilder parentBuilder,
                                                         Action <TDependency> configureDependency = null,
                                                         Func <IExtensionBuilder, TDependency, IDataBuilder> builderFactory = null)
            where TDependency : DataBuilderDependency
        {
            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <DataBuilderOptions>();

            // Add Builder Dependency
            var dependency = parentBuilder.AddBuilderDependency(out var dependencyType, configureDependency);

            parentBuilder.Services.TryAddReferenceBuilderDependency <DataBuilderDependency>(dependency, dependencyType);

            // Add Dependencies
            if (dependency.SupportsEntityFrameworkDesignTimeServices)
            {
                parentBuilder.Services
                .AddEntityFrameworkDesignTimeServices();

                // TypeMappingSourceDependencies 默认被重复注册导致依赖异常,须移除后重新注册
                parentBuilder.Services.TryRemoveAll <TypeMappingSourceDependencies>();
                parentBuilder.Services.AddSingleton <TypeMappingSourceDependencies>();
            }

            // Create Builder
            return(builderFactory.NotNullOrDefault(()
                                                   => (b, d) => new DataBuilder(b, d)).Invoke(parentBuilder, dependency));
        }
Ejemplo n.º 2
0
        public static IContentBuilder AddContent <TDependency>(this IExtensionBuilder parentBuilder,
                                                               Action <TDependency> configureDependency = null,
                                                               Func <IExtensionBuilder, TDependency, IContentBuilder> builderFactory = null)
            where TDependency : ContentBuilderDependency
        {
            if (!parentBuilder.TryGetBuilder <IDataBuilder>(out var dataBuilder))
            {
                throw new NotSupportedException($"You need to register to builder.{nameof(DataBuilderExtensions.AddData)}().");
            }

            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <ContentBuilderOptions>();

            // Add Builder Dependency
            var dependency = parentBuilder.AddBuilderDependency(out var dependencyType, configureDependency);

            parentBuilder.Services.TryAddReferenceBuilderDependency <ContentBuilderDependency>(dependency, dependencyType);

            // Create Builder
            var contentBuilder = builderFactory.NotNullOrDefault(()
                                                                 => (b, d) => new ContentBuilder(b, d)).Invoke(parentBuilder, dependency);

            var parameterMapper = ContentAccessorTypeParameterMappingHelper
                                  .ParseMapper(dataBuilder.AccessorTypeParameterMapper);

            contentBuilder.SetProperty(p => p.AccessorTypeParameterMapper, parameterMapper);

            return(contentBuilder);
        }
Ejemplo n.º 3
0
        public static INetworkBuilder AddNetwork <TDependency>(this IExtensionBuilder parentBuilder,
                                                               Action <TDependency> configureDependency = null,
                                                               Func <IExtensionBuilder, TDependency, INetworkBuilder> builderFactory = null)
            where TDependency : NetworkBuilderDependency
        {
            if (!parentBuilder.ContainsBuilder <IEncryptionBuilder>())
            {
                parentBuilder
                .AddEncryption()
                .AddDeveloperGlobalSigningCredentials();
            }

            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <NetworkBuilderOptions>();

            // Add Builder Dependency
            var dependency = parentBuilder.AddBuilderDependency(out var dependencyType, configureDependency);

            parentBuilder.Services.TryAddReferenceBuilderDependency <NetworkBuilderDependency>(dependency, dependencyType);

            // Add Dependencies
            parentBuilder.Services
            .AddHttpClient();

            // Create Builder
            return(builderFactory.NotNullOrDefault(()
                                                   => (b, d) => new NetworkBuilder(b, d)).Invoke(parentBuilder, dependency));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 添加 Librame。
        /// </summary>
        /// <typeparam name="TDependency">指定的依赖类型。</typeparam>
        /// <param name="services">给定的 <see cref="IServiceCollection"/>。</param>
        /// <param name="configureDependency">给定的配置依赖动作方法(可选)。</param>
        /// <param name="builderFactory">给定创建核心构建器的工厂方法(可选)。</param>
        /// <returns>返回 <see cref="ICoreBuilder"/>。</returns>
        public static ICoreBuilder AddLibrame <TDependency>(this IServiceCollection services,
                                                            Action <TDependency> configureDependency = null,
                                                            Func <IServiceCollection, TDependency, ICoreBuilder> builderFactory = null)
            where TDependency : CoreBuilderDependency, new()
        {
            // Use PreStarter
            services.AddLibramePreStarterFactory <PreStarterFactory>();
            services.UsePreStarter();

            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <CoreBuilderOptions>();

            // Add Builder Dependency
            var dependency = services.AddBuilderDependencyRoot(out var dependencyType, configureDependency);

            services.TryAddReferenceBuilderDependency <CoreBuilderDependency>(dependency, dependencyType);

            // Add Dependencies
            services
            .AddOptions()
            .AddLogging(dependency.ConfigureLoggingBuilder)
            .AddLocalization()
            .AddMemoryCache()
            .AddDistributedMemoryCache();

            // Create Builder
            return(builderFactory.NotNullOrDefault(()
                                                   => (s, d) => new CoreBuilder(s, d)).Invoke(services, dependency));
        }
        private static void RegisterPropertyOptionsDependency <TDependency>(IServiceCollection services,
                                                                            PropertyInfo property, IOptionsDependency propertyOptionsDependency, string optionsPropertyName)
            where TDependency : class, IExtensionBuilderDependency
        {
            // 利用选项实例的引用唯一性,注册一致性依赖属性选项实例以便 ConsistencyOptionsFactory 调用
            // 如:CoreBuilderDependency.Localization 的 LocalizationOptions 选项
            var propertyOptionsType = propertyOptionsDependency.OptionsType.Source;

            AddPropertyConsistencyOptions();

            // 如果需要注册依赖配置对象的选项配置节点
            //var propertyOptionsConfigurationRegistered = false;
            if (propertyOptionsDependency.Configuration.IsNotNull())
            {
                var propertyOptionsConfiguration = propertyOptionsDependency.Configuration.GetSection(optionsPropertyName);
                RegisterPropertyOptionsConfiguration(services, propertyOptionsConfiguration, propertyOptionsType);

                //propertyOptionsConfigurationRegistered = true;
            }

            //if (!propertyOptionsDependency.AutoConfigureOptions && !propertyOptionsDependency.AutoPostConfigureOptions)
            //    return;

            //var propertyConfigureOptionsName = nameof(OptionsDependency<TDependency>.ConfigureOptions);
            //var propertyConfigureOptionsAction = property.PropertyType.GetProperty(propertyConfigureOptionsName)?
            //    .GetValue(propertyOptionsDependency, index: null);

            //if (propertyConfigureOptionsAction.IsNull())
            //    return;

            //if (propertyOptionsDependency.AutoConfigureOptions && !propertyOptionsConfigurationRegistered)
            //    RegisterPropertyConfigureOptions(services, propertyOptionsType, propertyConfigureOptionsAction);

            //// ConfigureOptions 与 PostConfigureOptions 二选一
            ////if (!propertyOptionsDependency.AutoConfigureOptions && propertyOptionsDependency.AutoPostConfigureOptions)
            //if (propertyOptionsDependency.AutoPostConfigureOptions)
            //    RegisterPropertyPostConfigureOptions(services, propertyOptionsType, propertyConfigureOptionsAction);

            // AddPropertyConsistencyOptions
            void AddPropertyConsistencyOptions()
            {
                var propertyOptions = property.PropertyType.GetProperty(optionsPropertyName)
                                      .GetValue(propertyOptionsDependency, index: null);

                ConsistencyOptionsCache.AddOrUpdate(propertyOptionsType, propertyOptions);
            }
        }
Ejemplo n.º 6
0
        public static IDrawingBuilder AddDrawing <TDependency>(this IExtensionBuilder parentBuilder,
                                                               Action <TDependency> configureDependency = null,
                                                               Func <IExtensionBuilder, TDependency, IDrawingBuilder> builderFactory = null)
            where TDependency : DrawingBuilderDependency
        {
            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <DrawingBuilderOptions>();

            // Add Builder Dependency
            var dependency = parentBuilder.AddBuilderDependency(out var dependencyType, configureDependency);

            parentBuilder.Services.TryAddReferenceBuilderDependency <DrawingBuilderDependency>(dependency, dependencyType);

            // Create Builder
            return(builderFactory.NotNullOrDefault(()
                                                   => (b, d) => new DrawingBuilder(b, d)).Invoke(parentBuilder, dependency));
        }
        private static TDependency RegisterDependency <TDependency>(this TDependency dependency, IServiceCollection services)
            where TDependency : class, IExtensionBuilderDependency
        {
            services.AddSingleton(dependency);

            // 利用选项实例的引用唯一性,注册一致性依赖选项实例以便 ConsistencyOptionsFactory 调用
            // 如:CoreBuilderDependency 的 CoreBuilderOptions 选项
            var optionsPropertyName = nameof(OptionsDependency <TDependency> .Options);

            AddConsistencyOptions();

            // 获取所有依赖属性集合
            var properties = typeof(TDependency).GetProperties().Where(p =>
            {
                return(p.PropertyType.IsAssignableToBaseType(OptionsDependencyTypes.DependencyType) &&
                       p.PropertyType.IsGenericType);
            });

            foreach (var property in properties)
            {
                var propertyDependency = (IDependency)property.GetValue(dependency, index: null);

                if (propertyDependency.Configuration.IsNull())
                {
                    propertyDependency.Configuration = dependency.Configuration?.GetSection(property.Name);
                }

                if (propertyDependency is IOptionsDependency propertyOptionsDependency)
                {
                    RegisterPropertyOptionsDependency <TDependency>(services, property,
                                                                    propertyOptionsDependency, optionsPropertyName);
                }
            }

            return(dependency);

            // AddConsistencyOptions
            void AddConsistencyOptions()
            {
                var optionsProperty = typeof(TDependency).GetProperty(optionsPropertyName);
                var options         = optionsProperty.GetValue(dependency, index: null);

                ConsistencyOptionsCache.AddOrUpdate(optionsProperty.PropertyType, options);
            }
        }
Ejemplo n.º 8
0
        public static IPortalBuilder AddPortal <TDependency, TUser>(this IExtensionBuilder parentBuilder,
                                                                    Action <TDependency> configureDependency = null,
                                                                    Func <Type, IExtensionBuilder, TDependency, IPortalBuilder> builderFactory = null)
            where TDependency : PortalBuilderDependency
            where TUser : class
        {
            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <PortalBuilderOptions>();

            // Add Builder Dependency
            var dependency = parentBuilder.AddBuilderDependency(out var dependencyType, configureDependency);

            parentBuilder.Services.TryAddReferenceBuilderDependency <PortalBuilderDependency>(dependency, dependencyType);

            // Create Builder
            return(builderFactory.NotNullOrDefault(()
                                                   => (u, b, d) => new PortalBuilder(u, b, d)).Invoke(typeof(TUser), parentBuilder, dependency));
        }
Ejemplo n.º 9
0
        public static INetworkBuilder AddDotNetty <TDependency>(this INetworkBuilder builder,
                                                                Action <TDependency> configureDependency = null)
            where TDependency : DotNettyDependency
        {
            // Clear Options Cache
            ConsistencyOptionsCache.TryRemove <DotNettyOptions>();

            AddDotNettyServiceCharacteristics();

            // Add Builder Dependency
            var dependency = builder.AddBuilderDependency(out var dependencyType, configureDependency);

            builder.Services.TryAddReferenceBuilderDependency <DotNettyDependency>(dependency, dependencyType);

            builder.SetProperty(p => p.DotNettyDependency, dependency);

            // Configure Builder
            return(builder.AddDotNettyServices());
        }