`ReloadOnChange` от Autofac не перезагружает конфигурацию? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть простая базовая конфигурация для Autofac, которая использует файл конфигурации JSON:

 var config = new ConfigurationBuilder();
 config.AddJsonFile("autofac.json",false,true); //notice reloadOnChange

 // Register the ConfigurationModule with Autofac.
    var module = new ConfigurationModule(config.Build());
    var builder = new ContainerBuilder();
    builder.RegisterModule(module);


 // Set the dependency resolver to be Autofac.
    _container = builder.Build();

Вот JSON:

{
  "defaultAssembly": "AutoFacConfigFile",
  "components": [
    {
      "type": "AutoFacConfigFile.ConsoleOutput",
      "services": [
        {
          "type": "AutoFacConfigFile.IOutput"
        }
      ],
      "instanceScope": "single-instance",
      "injectProperties": true
    }
  ]
}

ConsoleOutput записывает точную строку ввода:

public class ConsoleOutput : IOutput
    {
        public void Write(string content)
        {
            Console.WriteLine(content);
        }
    }

Однако, ConsoleOutput2 записывает точную строку ввода + "222222222":

public class ConsoleOutput2 : IOutput
    {
        public void Write(string content)
        {
             Console.WriteLine(content+"22222222222");
        }
    }

Я хочу видеть, что если я изменю форму ConsoleOutput на ConsoleOutput2, тогда я увижу другой вывод во время выполнения, поэтому я создал цикл:

  static void Main(string[] args)
        {
            AutofacExt.InitAutofac();
            var writer = AutofacExt.GetFromFac<IOutput>();
            Get(writer).Wait();

        }

        public static async Task Get(IOutput writer)
        {
            for (int i = 0; i < 100; i++)
            {
               await Task.Delay(1000);
               writer.Write("s");
            }
        }

Однако, даже если я изменяю файл JSON, когда цикл работает, я не вижуновый ответ.Я вижу только старый ответ:

enter image description here

Вопрос:

Почему меняется с ConsoleOutput наConsoleOutput2 не отражает изменения?

Я ожидаю:

"s"
"s"
"s"
                             -- file changed and saved here --
"s2222222222"
"s2222222222"
"s2222222222"

1 Ответ

1 голос
/ 23 июня 2019

Autofac не предоставляет и не владеет компоновщиком конфигурации. Это не "Autofac's reloadOnChange", это "Microsoft.Extensions.Configuration's reloadOnChange."

Autofac будет читать конфигурацию, предоставленную в этом формате, однако, как только контейнер будет собран, вот и все. После этого между содержимым контейнера и конфигурацией не существует "связи" или чего-либо еще.

Контейнеры эффективно неизменяемы. Обновление контейнера удаляется по разным причинам , и по этим же причинам контейнер не перестраивается при изменении конфигурации.

Если вам нужно изменить содержимое при изменении конфигурации, вам нужно сделать это в коде приложения.

  • Поймать событие, которое указывает на изменение
  • Сборка нового контейнера
  • Поменять новый контейнер на старый контейнер

Это легче сказать, чем сделать, особенно когда приложение работает, и вещи могут содержать ссылки на объекты, разрешенные из старого контейнера. Это на самом деле большая причина, по которой это не поддерживается. У меня нет никаких указаний, как этого добиться, и я бы активно выступал против этого.

Опять же, проверьте это обсуждение, если вам интересно узнать, почему контейнеры являются неизменяемыми.

...