Esempio n. 1
0
        public static IDataBuilder AddAccessorService(this IDataBuilder builder,
                                                      Type serviceType, Type implementationTypeDefinition)
        {
            builder.NotNull(nameof(builder));

            return(builder.AddGenericServiceByPopulateAccessorTypeParameters(serviceType,
                                                                             implementationTypeDefinition));
        }
Esempio n. 2
0
        public static IDataBuilder AddAccessorAspect(this IDataBuilder builder, Type serviceType,
                                                     Type implementationTypeDefinition)
        {
            builder.NotNull(nameof(builder));

            return(builder.AddGenericServiceByPopulateAccessorTypeParameters(serviceType, implementationTypeDefinition,
                                                                             (type, descriptor) => type.MakeGenericType(descriptor.GenId.ArgumentType, descriptor.CreatedBy.ArgumentType),
                                                                             addEnumerable: true));
        }
Esempio n. 3
0
        /// <summary>
        /// 设置数据构建器。
        /// </summary>
        /// <param name="memoryCache">给定的 <see cref="IMemoryCache"/>。</param>
        /// <param name="builder">给定的 <see cref="IDataBuilder"/>。</param>
        /// <returns>返回 <see cref="IMemoryCache"/>。</returns>
        public static IMemoryCache SetDataBuilder(this IMemoryCache memoryCache,
                                                  IDataBuilder builder)
        {
            builder.NotNull(nameof(builder));
            memoryCache.NotNull(nameof(memoryCache));

            memoryCache.Set(nameof(IDataBuilder), builder);

            return(memoryCache);
        }
        public static IDataBuilder AddAccessor <TAccessor, TImplementation>(this IDataBuilder builder,
                                                                            Action <ITenant, DbContextOptionsBuilder> setupAction, int poolSize = 128)
            where TAccessor : class, IAccessor
            where TImplementation : DbContext, TAccessor
        {
            builder.NotNull(nameof(builder));
            setupAction.NotNull(nameof(setupAction));

            var mapper = AccessorTypeParameterMappingHelper.ParseMapper(typeof(TImplementation));

            builder.SetProperty(p => p.AccessorTypeParameterMapper, mapper);

            if (poolSize > 0)
            {
                builder.Services.AddDbContextPool <TAccessor, TImplementation>(ConfigureOptionsBuilder, poolSize);
            }
            else
            {
                builder.Services.AddDbContext <TAccessor, TImplementation>(ConfigureOptionsBuilder);
            }

            builder.Services.TryAddScoped(sp => (TImplementation)sp.GetRequiredService <TAccessor>());

            return(builder
                   .AddInternalAccessorServices()
                   .AddDesignTimeServices <TImplementation>());

            // ConfigureOptionsBuilder
            void ConfigureOptionsBuilder(IServiceProvider applicationServiceProvider,
                                         DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.ReplaceServices();

                if (builder.MemoryCache.IsNull())
                {
                    var memoryCache = applicationServiceProvider.GetRequiredService <IMemoryCache>();
                    memoryCache.SetDataBuilder(builder);

                    builder.SetProperty(p => p.MemoryCache, memoryCache);
                    optionsBuilder.UseMemoryCache(memoryCache);
                }

                setupAction.Invoke((builder.Dependency as DataBuilderDependency).Options.DefaultTenant,
                                   optionsBuilder);
            }
        }
Esempio n. 5
0
        public static IDataBuilder AddDatabaseDesignTime <TDesignTime>(this IDataBuilder builder)
            where TDesignTime : class, IDesignTimeServices
        {
            builder.NotNull(nameof(builder));

            var designTimeType = typeof(TDesignTime);

            builder.SetProperty(p => p.DatabaseDesignTimeType, designTimeType);

            var designTime = designTimeType.EnsureCreate <TDesignTime>();

            designTime.ConfigureDesignTimeServices(builder.Services);

            builder.Services.Configure <DataBuilderOptions>(options =>
            {
                var reference = AssemblyDescriptor.Create(designTimeType.Assembly);
                if (!options.MigrationAssemblyReferences.Contains(reference))
                {
                    options.MigrationAssemblyReferences.Add(reference);
                }
            });

            return(builder);
        }