Изменить. NET Базовая конфигурация среды выполнения и перезагрузить ее - PullRequest
0 голосов
/ 25 февраля 2020

Я хотел бы изменить строки подключения, помещенные в appsettings. json файл во время выполнения в NET Core 2.2.

Итак, моя работа:

  1. Изменить строку подключения в настройках приложения. json во время выполнения
  2. Перезагрузить класс конфигурации, чтобы получить измененную строку подключения
  3. Refre sh весь datacontext для использования новой строки подключения

Я думаю, что 1. шаг в порядке, я использую этот код и appsettings. json успешно изменяется:

    public static void ChangeConnectionStringsInAppSettings(eConnectionStringType cstrType, string value)
    {
        var d = AppDomain.CurrentDomain.BaseDirectory;

        ChangeSettingsFile(Path.Combine(d, "appsettings.json"), cstrType, value);
        ChangeSettingsFile(Path.Combine(d, "appsettings.Development.json"), cstrType, value);
        ChangeSettingsFile(Path.Combine(d, "appsettings.Production.json"), cstrType, value);
    }

    private static void ChangeSettingsFile(string appSettingsJsonFilePath, eConnectionStringType cstrType, string value)
    {
        if (System.IO.File.Exists(appSettingsJsonFilePath))
        {
            var json = System.IO.File.ReadAllText(appSettingsJsonFilePath);
            dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(json);

            if (cstrType == eConnectionStringType.Identity)
            {
                jsonObj["ConnectionStrings"]["IdentityConnection"] = value;
            }
            else if (cstrType == eConnectionStringType.Data)
            {
                jsonObj["ConnectionStrings"]["DefaultConnection"] = value;
            }

            string output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented);

            System.IO.File.WriteAllText(appSettingsJsonFilePath, output);
        }
    }

С setp 2 и 3 у меня проблема. Я пытаюсь заставить работать IOptionsMonitor с DI, но он всегда показывает старое значение:

public class Startup
{

    public class ConnectionStrings
    {
        public string IdentityConnection { get; set; }
    }

    public void ConfigureServices(IServiceCollection services)

        // ...
        services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
        // ...
    }
}

Контроллер:

 public RolesController(
           AuthContext ACTX
         , MySiteContext CTX
         , UserManager<ApplicationUser> userManager
         , RoleManager<ApplicationRole> roleManager
         , IConfiguration configuration
         , IStringLocalizer localizer
         , My my
         , IRolesRepository repo
         , IOptionsMonitor<ConnectionStrings> options)
         : base(ACTX, CTX, userManager, roleManager, configuration, localizer, my, repo)
        {
            var _myValues = options.CurrentValue;
        }

        [UseAjax]
        [UseTelerik]
        [UseClientSideValidation]
        public IActionResult Index()
        {
            ChangeConnectionStringsInAppSettings(eConnectionStringType.Identity, "old");
            this.CheckDatabase();

            return View(new ApplicationRoleDto());
        }

        [UseAjax]
        [UseTelerik]
        [UseClientSideValidation]
        public IActionResult Index2()
        {
            ChangeConnectionStringsInAppSettings(eConnectionStringType.Identity, "new");
            this.CheckDatabase();

            return View("Index",new ApplicationRoleDto());
        }

Я остановился на этом шаге. Новое значение не загружается, и после того, как мне это удастся, мне нужно установить новые строки подключения для всего текста данных.

Не могли бы вы помочь мне, пожалуйста? Спасибо!

...