public void RefreshInstance(string moduleCode, Dictionary <string, object> values)
        {
            if (values == null || !values.Any())
            {
                return;
            }

            var descriptor = _moduleOptionsCollection.FirstOrDefault(m => m.Module.Code.EqualsIgnoreCase(moduleCode));

            if (descriptor == null || descriptor.OptionsType == null)
            {
                return;
            }

            var instance = (IModuleOptions)_serviceProvider.GetService(descriptor.OptionsType);

            if (instance == null)
            {
                return;
            }

            //通过Copy方法创建旧实例
            var oldInstance = instance.Copy();

            var storageModels = new List <ModuleOptionStorageModel>();

            foreach (var definition in descriptor.Definitions)
            {
                var value = values.FirstOrDefault(m => m.Key.EqualsIgnoreCase(definition.DataName)).Value;

                SetValue(instance, definition.PropertyInfo, value);

                var storageModel = new ModuleOptionStorageModel
                {
                    Key     = definition.Key,
                    Value   = value?.ToString(),
                    Remarks = definition.Name
                };

                storageModels.Add(storageModel);
            }

            //持久化
            _storageProvider.Save(storageModels);

            foreach (var changedEventType in descriptor.ChangedEvents)
            {
                var changedEvent = _serviceProvider.GetService(changedEventType);
                var method       = changedEventType.GetMethod("OnChanged");
                if (method != null)
                {
                    method.Invoke(changedEvent, new object[] { instance, oldInstance });
                }
            }
        }
Exemple #2
0
        public void RefreshInstance(string moduleCode, Dictionary <string, object> values)
        {
            if (values == null || !values.Any())
            {
                return;
            }

            var descriptor = _moduleOptionsCollection.FirstOrDefault(m => m.Module.Id.EqualsIgnoreCase(moduleCode));

            if (descriptor == null || descriptor.OptionsType == null)
            {
                return;
            }

            var instance = (IModuleOptions)_serviceProvider.GetService(descriptor.OptionsType);

            if (instance == null)
            {
                return;
            }

            //通过序列化深拷贝保留旧实例
            var oldInstance = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(instance), descriptor.OptionsType);

            var storageModels = new List <ModuleOptionStorageModel>();

            foreach (var definition in descriptor.Definitions)
            {
                var value = values.FirstOrDefault(m => m.Key.EqualsIgnoreCase(definition.DataName)).Value;

                var propertyInfo = definition.PropertyInfo;

                #region ==设置属性值==

                if (propertyInfo.PropertyType.IsEnum)
                {
                    propertyInfo.SetValue(instance, Enum.Parse(propertyInfo.PropertyType, value.ToString()));
                }
                else if (propertyInfo.PropertyType.IsNullable() && value == null)
                {
                    propertyInfo.SetValue(instance, null);
                }
                else
                {
                    var pType = propertyInfo.PropertyType;
                    if (pType.IsNullable())
                    {
                        pType = Nullable.GetUnderlyingType(pType);
                    }

                    if (pType.IsString())
                    {
                        propertyInfo.SetValue(instance, value?.ToString());
                    }
                    else if (pType.IsDateTime() || pType.IsBool())
                    {
                        propertyInfo.SetValue(instance, value);
                    }
                    else if (pType.IsGuid())
                    {
                        propertyInfo.SetValue(instance, Guid.Parse(value.ToString()));
                    }
                    else
                    {
                        propertyInfo.SetValue(instance, Convert.ChangeType(value, pType));
                    }
                }

                #endregion

                var storageModel = new ModuleOptionStorageModel
                {
                    Key     = definition.Key,
                    Value   = value?.ToString(),
                    Remarks = definition.Name
                };

                storageModels.Add(storageModel);
            }

            //持久化
            _storageProvider.Save(storageModels);

            foreach (var changedEventType in descriptor.ChangedEvents)
            {
                var changedEvent = _serviceProvider.GetService(changedEventType);
                var method       = changedEventType.GetMethod("OnChanged");
                if (method != null)
                {
                    method.Invoke(changedEvent, new object[] { instance, oldInstance });
                }
            }
        }