首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac的“`reloadOnChange`”不重新加载配置?

Autofac的“`reloadOnChange`”不重新加载配置?
EN

Stack Overflow用户
提问于 2019-06-21 18:52:57
回答 1查看 147关注 0票数 0

对于Autofac,我有一个简单的基本配置,它使用JSON配置文件:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
{
  "defaultAssembly": "AutoFacConfigFile",
  "components": [
    {
      "type": "AutoFacConfigFile.ConsoleOutput",
      "services": [
        {
          "type": "AutoFacConfigFile.IOutput"
        }
      ],
      "instanceScope": "single-instance",
      "injectProperties": true
    }
  ]
}

ConsoleOutput写入准确的输入字符串:

代码语言:javascript
复制
public class ConsoleOutput : IOutput
    {
        public void Write(string content)
        {
            Console.WriteLine(content);
        }
    }

但是,ConsoleOutput2会写入精确的输入字符串+ "222222222":

代码语言:javascript
复制
public class ConsoleOutput2 : IOutput
    {
        public void Write(string content)
        {
             Console.WriteLine(content+"22222222222");
        }
    }

我希望看到,如果我将ConsoleOutput改为ConsoleOutput2,那么我将看到运行时的不同输出,这就是为什么我创建了一个循环:

代码语言:javascript
复制
  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文件,当循环运行时,我也看不到新的响应。我只看到老一套的回答:

问题:

为什么从ConsoleOutputConsoleOutput2的变化并不反映这种变化?

我希望:

代码语言:javascript
复制
"s"
"s"
"s"
                             -- file changed and saved here --
"s2222222222"
"s2222222222"
"s2222222222"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-23 15:56:18

Autofac不提供或拥有配置生成器。这不是“Autofac的reloadOnChange",而是”Microsoft.Extensions.Configuration的reloadOnChange“。

Autofac将读取以该格式提供的配置,但是,一旦容器构建完毕,就这样了。在容器内容和之后的配置之间没有“绑定”或任何东西。

容器实际上是不可变的。由于各种原因,正在删除更新容器。和相同的原因--容器没有在配置更改时重新构建。

如果需要更改配置更改的内容,则需要在应用程序代码中这样做。

  • 捕获指示更改的事件
  • 构建一个全新的容器
  • 将新容器替换为旧容器

这说起来容易做起来难,特别是在应用程序正在运行的时候,而且东西可能保存着从旧容器解析的对象的引用。这实际上是这个不被支持的一个重要原因。我对如何做到这一点没有指导,我会积极反对。

再说一遍,如果您对容器不可变的更多内容感兴趣,请查看下面的讨论。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56708984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档