Esempio n. 1
0
        /// <summary>
        /// 加入邏輯管理
        /// </summary>
        /// <typeparam name="TLogic">邏輯管理器類型</typeparam>
        /// <typeparam name="TContext">資料庫內容類型</typeparam>
        /// <param name="services">服務集合</param>
        /// <param name="optionsAction">EntityFramework選項</param>
        /// <returns>動態邏輯建構器</returns>
        public static DynamicLogicMapBuilder <TContext> AddLogic <TLogic, TContext>(
            this IServiceCollection services,
            Action <DbContextOptionsBuilder> optionsAction)
            where TLogic : LogicManagerBase <TContext>
            where TContext : DbContext
        {
            services.AddDbContext <TContext>(optionsAction);

            var builder = new DynamicLogicMapBuilder <TContext>();

            services.AddScoped <TLogic>(serviceProvider => {
                var constructors   = typeof(TLogic).GetConstructors().FirstOrDefault();
                var createServices = constructors.GetParameters().Select(x => x.ParameterType)
                                     .Select(x => serviceProvider.GetService(x)).ToArray();
                var instance        = (TLogic)constructors.Invoke(createServices);
                instance.MapBuilder = builder;

                return(instance);
            });

            return(builder);
        }
Esempio n. 2
0
        /// <summary>
        /// 加入邏輯管理
        /// </summary>
        /// <typeparam name="TLogic">邏輯管理器類型</typeparam>
        /// <typeparam name="TContext">資料庫內容類型</typeparam>
        /// <param name="services">服務集合</param>
        /// <returns>動態邏輯建構器</returns>
        public static DynamicLogicMapBuilder <TContext> AddLogic <TLogic, TContext>(
            this IServiceCollection services)
            where TLogic : LogicManagerBase <TContext>
            where TContext : DbContext
        {
            services.AddDbContext <TContext>();

            var builder = new DynamicLogicMapBuilder <TContext>();

            services.AddScoped <InternalLogicManagerContainer <TContext> >();

            services.AddScoped <TLogic>(serviceProvider => {
                var constructors   = typeof(TLogic).GetConstructors().FirstOrDefault();
                var createServices = constructors.GetParameters().Select(x => x.ParameterType)
                                     .Select(x => serviceProvider.GetService(x)).ToArray();
                var instance             = (TLogic)constructors.Invoke(createServices);
                instance.MapBuilder      = builder;
                instance.ServiceProvider = serviceProvider;

                var scopeContainer     = serviceProvider.GetService <InternalLogicManagerContainer <TContext> >();
                scopeContainer.Manager = instance;

                foreach (var property in typeof(TLogic).GetProperties())
                {
                    var isLogic = GetAllBaseTypes(property.PropertyType).Where(x => x.IsGenericType).Select(x => x.GetGenericTypeDefinition()).Contains(typeof(LogicBase <, ,>));

                    if (!isLogic)
                    {
                        continue;
                    }

                    var propertyValue = serviceProvider.GetService(property.PropertyType);

                    property.SetValue(instance, propertyValue);
                }

                return(instance);
            });

            foreach (var property in typeof(TLogic).GetProperties())
            {
                var isLogic = GetAllBaseTypes(property.PropertyType).Where(x => x.IsGenericType).Select(x => x.GetGenericTypeDefinition()).Contains(typeof(LogicBase <, ,>));

                if (!isLogic)
                {
                    continue;
                }

                services.AddScoped(property.PropertyType, serviceProvider => {
                    var scopeContainer = serviceProvider.GetService <InternalLogicManagerContainer <TContext> >();

                    var constuctor = property.PropertyType.GetConstructors().Single();

                    var parameterValues = new List <object>();
                    foreach (var param in constuctor.GetParameters())
                    {
                        var isLogicManager = param.ParameterType.GetAllBaseTypes().Where(x => x.IsGenericType).Select(x => x.GetGenericTypeDefinition()).Contains(typeof(LogicManagerBase <>));

                        if (isLogicManager)
                        {
                            parameterValues.Add(scopeContainer.Manager ?? serviceProvider.GetService(param.ParameterType));
                        }
                        else
                        {
                            parameterValues.Add(serviceProvider.GetService(param.ParameterType));
                        }
                    }

                    return(constuctor.Invoke(parameterValues.ToArray()));
                });
            }

            return(builder);
        }