/// <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)); } }
/// <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); } }
/// <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(); }
/// <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(); }
/// <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(); }
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)); }
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; }
/// <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; }
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>(); }
/// <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); }
/// <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)); }
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)); }
/// <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)); }
/// <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(); }
/// <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);