Example #1
0
        /// <summary>
        /// 构造一个 <see cref="ContentBuilder"/>。
        /// </summary>
        /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="dependency">给定的 <see cref="ContentBuilderDependency"/>。</param>
        public ContentBuilder(IExtensionBuilder parentBuilder, ContentBuilderDependency dependency)
            : base(parentBuilder, dependency)
        {
            Services.AddSingleton <IContentBuilder>(this);

            //AddInternalServices();
        }
        /// <summary>
        /// 尝试获取指定构建器类型的实例(支持查找当前或父级实例)。
        /// </summary>
        /// <typeparam name="TBuilder">指定的构建器类型。</typeparam>
        /// <param name="currentBuilder">给定的当前 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="resultBuilder">输出结果 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="excludeCurrentBuilder">排除当前 <see cref="IExtensionBuilder"/>(可选;默认不排除)。</param>
        /// <returns>返回是否成功获取的布尔值。</returns>
        public static bool TryGetBuilder <TBuilder>(this IExtensionBuilder currentBuilder,
                                                    out TBuilder resultBuilder, bool excludeCurrentBuilder = false)
            where TBuilder : class, IExtensionBuilder
        {
            resultBuilder = LookupBuilder(excludeCurrentBuilder
                ? currentBuilder?.ParentBuilder
                : currentBuilder);

            return(resultBuilder.IsNotNull());

            // LookupBuilder
            TBuilder LookupBuilder(IExtensionBuilder extensionBuilder)
            {
                if (extensionBuilder.IsNull())
                {
                    return(null);
                }

                if (extensionBuilder is TBuilder builder)
                {
                    return(builder);
                }

                // 链式查找父级构建器
                return(LookupBuilder(extensionBuilder.ParentBuilder));
            }
        }
Example #3
0
        /// <summary>
        /// 构造一个 <see cref="DrawingBuilder"/>。
        /// </summary>
        /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="dependency">给定的 <see cref="DrawingBuilderDependency"/>。</param>
        public DrawingBuilder(IExtensionBuilder parentBuilder, DrawingBuilderDependency dependency)
            : base(parentBuilder, dependency)
        {
            Services.AddSingleton <IDrawingBuilder>(this);

            AddDrawingServices();
        }
        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));
        }
        /// <summary>
        /// 枚举当前以及父级构建器字典集合。
        /// </summary>
        /// <param name="currentBuilder">给定的当前 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="excludeCurrentBuilder">排除当前 <see cref="IExtensionBuilder"/>(可选;默认不排除)。</param>
        /// <returns>返回字典集合。</returns>
        public static Dictionary <string, IExtensionBuilder> EnumerateBuilders
            (this IExtensionBuilder currentBuilder, bool excludeCurrentBuilder = false)
        {
            var builders = new Dictionary <string, IExtensionBuilder>();

            LookupBuilder(excludeCurrentBuilder
                ? currentBuilder?.ParentBuilder
                : currentBuilder);

            return(builders);

            // LookupBuilder
            void LookupBuilder(IExtensionBuilder builder)
            {
                if (builder.IsNull())
                {
                    return;
                }

                builders.Add(builder.Name, builder);

                // 链式查找父级构建器
                LookupBuilder(builder.ParentBuilder);
            }
        }
Example #6
0
        /// <summary>
        /// 构造一个 <see cref="EncryptionBuilder"/>。
        /// </summary>
        /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="dependency">给定的 <see cref="EncryptionBuilderDependency"/>。</param>
        public EncryptionBuilder(IExtensionBuilder parentBuilder, EncryptionBuilderDependency dependency)
            : base(parentBuilder, dependency)
        {
            Services.AddSingleton <IEncryptionBuilder>(this);

            AddEncryptionServices();
        }
Example #7
0
        /// <summary>
        /// 构造一个 <see cref="NetworkBuilder"/>。
        /// </summary>
        /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="dependency">给定的 <see cref="NetworkBuilderDependency"/>。</param>
        public NetworkBuilder(IExtensionBuilder parentBuilder, NetworkBuilderDependency dependency)
            : base(parentBuilder, dependency)
        {
            Services.AddSingleton <INetworkBuilder>(this);

            AddNetworkServices();
        }
Example #8
0
        /// <summary>
        /// 构造一个 <see cref="StorageBuilder"/>。
        /// </summary>
        /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="dependency">给定的 <see cref="StorageBuilderDependency"/>。</param>
        public StorageBuilder(IExtensionBuilder parentBuilder, StorageBuilderDependency dependency)
            : base(parentBuilder, dependency)
        {
            Services.AddSingleton <IStorageBuilder>(this);

            AddInternalServices();
        }
Example #9
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));
        }
Example #10
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);
        }
        protected AbstractExtensionBuilder(IExtensionBuilder parentBuilder, IExtensionBuilderDependency dependency)
        {
            Dependency    = dependency.NotNull(nameof(dependency));
            ParentBuilder = parentBuilder.NotNull(nameof(parentBuilder));

            Services = parentBuilder.Services;
        }
 /// <summary>
 /// 使用配置对象与(或)选项动作配置实现 <see cref="IExtensionOptions"/> 的扩展选项。
 /// </summary>
 /// <typeparam name="TOptions">指定实现的 <see cref="IExtensionOptions"/> 的扩展选项。</typeparam>
 /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
 /// <param name="setupOptions">给定可用于设置 <typeparamref name="TOptions"/> 选项的动作(可空;为空则不设置)。</param>
 /// <param name="configuration">给定的 <see cref="IConfiguration"/>(可空;为空则不设置)。</param>
 /// <returns>返回 <see cref="IExtensionBuilder"/>。</returns>
 public static IExtensionBuilder ConfigureExtensionOptions <TOptions>(
     this IExtensionBuilder parentBuilder,
     Action <TOptions>?setupOptions, IConfiguration?configuration)
     where TOptions : class, IExtensionOptions
 {
     parentBuilder.Services.ConfigureExtensionOptions(setupOptions, configuration);
     return(parentBuilder);
 }
        protected void Initialize(IExtensionBuilder builder, Action <object> newItemHandler, Action <object> extensionRemovedHandler)
        {
            Builder           = builder;
            NewItemHandler    = newItemHandler;
            RemoveItemHandler = extensionRemovedHandler;

            builder.ItemAdded   += builder_ItemAdded;
            builder.ItemRemoved += builder_ItemRemoved;
        }
Example #14
0
        /// <summary>
        /// 构造一个 <see cref="PortalBuilder"/>。
        /// </summary>
        /// <param name="userType">指定的用户类型。</param>
        /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="dependency">给定的 <see cref="PortalBuilderDependency"/>。</param>
        public PortalBuilder(Type userType, IExtensionBuilder parentBuilder, PortalBuilderDependency dependency)
            : base(parentBuilder, dependency)
        {
            UserType = userType.NotNull(nameof(userType));

            Services.AddSingleton <IPortalBuilder>(this);

            AddInternalServices();
        }
        public ExtensionChangeHandler(IExtensionBuilder builder, Action <object> newItemHandler,
                                      Action <object> extensionRemovedHandler)
        {
            Builder           = builder;
            NewItemHandler    = newItemHandler;
            RemoveItemHandler = extensionRemovedHandler;

            builder.ItemAdded   += builder_ItemAdded;
            builder.ItemRemoved += builder_ItemRemoved;
        }
Example #16
0
        public static IExtensionBuilder AddPublic(this IExtensionBuilder parentBuilder)
        {
            var dependency = new PublicBuilderDependency(parentBuilder.Dependency);
            var builder    = new PublicBuilder(parentBuilder, dependency);

            parentBuilder.Services.AddSingleton(builder);
            parentBuilder.Services.AddSingleton(dependency);

            return(builder);
        }
        /// <summary>
        /// 获取必需的构建器实例。
        /// </summary>
        /// <typeparam name="TBuilder">指定的构建器类型。</typeparam>
        /// <param name="currentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
        /// <param name="excludeCurrentBuilder">排除当前 <see cref="IExtensionBuilder"/>(可选;默认不排除)。</param>
        /// <returns>返回 <typeparamref name="TBuilder"/> 或抛出 <see cref="InvalidOperationException"/>。</returns>
        public static TBuilder GetRequiredBuilder <TBuilder>(this IExtensionBuilder currentBuilder,
                                                             bool excludeCurrentBuilder = false)
            where TBuilder : class, IExtensionBuilder
        {
            if (!currentBuilder.TryGetBuilder <TBuilder>(out var resultBuilder, excludeCurrentBuilder))
            {
                throw new InvalidOperationException($"The current builder is not or does not contain a parent builder '{typeof(TBuilder)}'.");
            }

            return(resultBuilder);
        }
    /// <summary>
    /// 查找指定目标扩展构建器(支持链式查找父级扩展构建器)。
    /// </summary>
    /// <typeparam name="TTargetBuilder">指定的目标扩展构建器类型。</typeparam>
    /// <param name="lastBuilder">给定配置的最后一个 <see cref="IExtensionBuilder"/>。</param>
    /// <returns>返回 <typeparamref name="TTargetBuilder"/>。</returns>
    public static TTargetBuilder?FindBuilder <TTargetBuilder>(this IExtensionBuilder lastBuilder)
        where TTargetBuilder : IExtensionBuilder
    {
        if (!(lastBuilder is TTargetBuilder targetBuilder))
        {
            if (lastBuilder.ParentBuilder is not null)
            {
                return(FindBuilder <TTargetBuilder>(lastBuilder.ParentBuilder));
            }

            return(default);
    /// <summary>
    /// 构造一个 <see cref="DrawingExtensionBuilder"/>。
    /// </summary>
    /// <exception cref="ArgumentNullException">
    /// <paramref name="parentBuilder"/> 为空。
    /// </exception>
    /// <param name="parentBuilder">给定的父级 <see cref="IExtensionBuilder"/>。</param>
    public DrawingExtensionBuilder(IExtensionBuilder parentBuilder)
        : base(parentBuilder)
    {
        // Drawers
        ServiceCharacteristics.AddSingleton <ISavingDrawer>();
        ServiceCharacteristics.AddSingleton <IScalingDrawer>();
        ServiceCharacteristics.AddSingleton <IWatermarkDrawer>();

        // Verification
        ServiceCharacteristics.AddScope <ICaptchaGenerator>();
    }
Example #20
0
        /// <summary>
        /// Configures the extensions.
        /// </summary>
        /// <param name="builder">The builder.</param>
        /// <returns></returns>
        public static IExtensionBuilder ConfigureExtensions(this IExtensionBuilder builder)
        {
            var extensions = builder.ServiceProvider.GetServices <IExtension>();

            foreach (var item in extensions)
            {
                item.ConfigureServices(builder.Services);
            }

            return(builder);
        }
Example #21
0
    /// <summary>
    /// 注册 Librame 图画扩展构建器。
    /// </summary>
    /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
    /// <param name="setupOptions">给定可用于设置 <see cref="DrawingExtensionOptions"/> 选项的动作(可选;为空则不设置)。</param>
    /// <param name="configuration">给定可用于 <see cref="DrawingExtensionOptions"/> 选项的配置对象(可选;为空则不配置)。</param>
    /// <returns>返回 <see cref="DrawingExtensionOptions"/>。</returns>
    public static DrawingExtensionBuilder AddDrawing(this IExtensionBuilder parentBuilder,
                                                     Action <DrawingExtensionOptions>?setupOptions = null, IConfiguration?configuration = null)
    {
        // 配置扩展选项
        parentBuilder.ConfigureExtensionOptions(setupOptions, configuration);

        var builder = new DrawingExtensionBuilder(parentBuilder);

        builder
        .AddDrawers()
        .AddVerification();

        return(builder);
    }
        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));
        }
Example #23
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));
        }
Example #24
0
    /// <summary>
    /// 注册 Librame 数据扩展构建器。
    /// </summary>
    /// <param name="parentBuilder">给定的 <see cref="IExtensionBuilder"/>。</param>
    /// <param name="setupOptions">给定可用于设置 <see cref="DataExtensionOptions"/> 选项的动作(可选;为空则不设置)。</param>
    /// <param name="configuration">给定可用于 <see cref="DataExtensionOptions"/> 选项的配置对象(可选;为空则不配置)。</param>
    /// <returns>返回 <see cref="DataExtensionBuilder"/>。</returns>
    public static DataExtensionBuilder AddData(this IExtensionBuilder parentBuilder,
                                               Action <DataExtensionOptions>?setupOptions = null, IConfiguration?configuration = null)
    {
        // 配置扩展选项
        parentBuilder.ConfigureExtensionOptions(setupOptions, configuration);

        var builder = new DataExtensionBuilder(parentBuilder);

        builder
        .AddAccessing()
        .AddAuditing()
        .AddIdentification()
        .AddSharding()
        .AddStoring()
        .AddValueConversion();

        return(builder);
    }
        public static TDependency AddBuilderDependency <TDependency>(this IExtensionBuilder baseBuilder,
                                                                     out Type dependencyType, Action <TDependency> configureDependency = null)
            where TDependency : class, IExtensionBuilderDependency
        {
            baseBuilder.NotNull(nameof(baseBuilder));

            dependencyType = typeof(TDependency);
            var dependency = dependencyType.EnsureCreate <TDependency>(baseBuilder.Dependency);

            dependency.ConfigurationRoot = baseBuilder.Dependency.ConfigurationRoot;
            dependency.Configuration     = dependency.ConfigurationRoot?.GetSection(dependency.Name);

            // Bind Configuration
            if (dependency.Configuration.IsNotNull())
            {
                dependency.Configuration.Bind(dependency);
            }

            // configureDependency: dependency => dependency.Configuration = ...;
            configureDependency?.Invoke(dependency);

            return(dependency.RegisterDependency(baseBuilder.Services));
        }
Example #26
0
    /// <summary>
    /// 构造一个 <see cref="DataExtensionBuilder"/>。
    /// </summary>
    /// <exception cref="ArgumentNullException">
    /// <paramref name="parentBuilder"/> 为空。
    /// </exception>
    /// <param name="parentBuilder">给定的父级 <see cref="IExtensionBuilder"/>。</param>
    public DataExtensionBuilder(IExtensionBuilder parentBuilder)
        : base(parentBuilder)
    {
        ServiceCharacteristics.AddSingleton <IIdGeneratorFactory>();
        ServiceCharacteristics.AddSingleton <IAuditingManager>();

        // Accessing
        ServiceCharacteristics.AddScope <IAccessorManager>();
        ServiceCharacteristics.AddScope <IAccessorMigrator>();
        ServiceCharacteristics.AddScope <IAccessorResolver>();

        ServiceCharacteristics.AddScope <IAccessorSeeder>(addImplementationType: true);
        ServiceCharacteristics.AddScope <IAccessorInitializer>();

        // Sharding
        ServiceCharacteristics.AddSingleton <IShardingManager>();

        // Storing
        ServiceCharacteristics.AddScope(typeof(IStore <>));

        // ValueConversion
        ServiceCharacteristics.AddSingleton <IEncryptionConverterFactory>();
    }
 /// <summary>
 /// 添加图画扩展。
 /// </summary>
 /// <param name="parentBuilder">给定的父级 <see cref="IExtensionBuilder"/>。</param>
 /// <param name="configureDependency">给定的配置依赖动作方法(可选)。</param>
 /// <param name="builderFactory">给定创建图画构建器的工厂方法(可选)。</param>
 /// <returns>返回 <see cref="IDrawingBuilder"/>。</returns>
 public static IDrawingBuilder AddDrawing(this IExtensionBuilder parentBuilder,
                                          Action <DrawingBuilderDependency> configureDependency = null,
                                          Func <IExtensionBuilder, DrawingBuilderDependency, IDrawingBuilder> builderFactory = null)
 => parentBuilder.AddDrawing <DrawingBuilderDependency>(configureDependency, builderFactory);
 public ExtensionChangeHandler(IExtensionBuilder builder, Action <object> newItemHandler,
                               Action <object> extensionRemovedHandler)
 {
     Initialize(builder, newItemHandler, extensionRemovedHandler);
 }
 public AbstractionBuilderExtensionsTests()
 {
     _builder = new ServiceCollection()
                .AddInternal(new InternalBuilderDependency())
                .AddPublic();
 }
Example #30
0
 /// <summary>
 /// 添加门户扩展。
 /// </summary>
 /// <typeparam name="TUser">指定的用户类型。</typeparam>
 /// <param name="parentBuilder">给定的父级 <see cref="IExtensionBuilder"/>。</param>
 /// <param name="configureDependency">给定的配置依赖动作方法(可选)。</param>
 /// <param name="builderFactory">给定创建门户构建器的工厂方法(可选)。</param>
 /// <returns>返回 <see cref="IPortalBuilder"/>。</returns>
 public static IPortalBuilder AddPortal <TUser>(this IExtensionBuilder parentBuilder,
                                                Action <PortalBuilderDependency> configureDependency = null,
                                                Func <Type, IExtensionBuilder, PortalBuilderDependency, IPortalBuilder> builderFactory = null)
     where TUser : class
 => parentBuilder.AddPortal <PortalBuilderDependency, TUser>(configureDependency, builderFactory);