Autofac 的 `reloadOnChange` 不会重新加载配置?
Autofac's `reloadOnChange` doesn't reload the configuration?
我有一个简单的 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 文件,当循环为 运行 时,我也看不到新的响应。我只看到旧的回复:
问题:
为什么从 ConsoleOutput
更改为 ConsoleOutput2
没有反映更改?
我预计:
"s"
"s"
"s"
-- file changed and saved here --
"s2222222222"
"s2222222222"
"s2222222222"
Autofac 不提供也不拥有配置生成器。不是 "Autofac's reloadOnChange
",是 "Microsoft.Extensions.Configuration's reloadOnChange
."
Autofac 将读取以该格式提供的配置,但是,一旦构建了容器,就是这样。容器内容和之后的配置之间没有 "tie" 或任何东西。
容器实际上是不可变的。 Updating the container is being removed for a variety of reasons 这也是容器未在配置更改时重建的相同原因。
如果您需要更改配置更改的内容,您需要在您的应用程序代码中执行此操作。
- 捕捉指示变化的事件
- 构建一个全新的容器
- 将新容器换成旧容器
说起来容易做起来难,尤其是当应用程序 运行 并且其中可能包含对从旧容器解析的对象的引用时。这实际上是不支持的一个重要原因。我没有关于如何实现这一点的指导,并且会积极反对它。
同样,check out this discussion if you're interested in more on why containers are immutable.
我有一个简单的 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 文件,当循环为 运行 时,我也看不到新的响应。我只看到旧的回复:
问题:
为什么从 ConsoleOutput
更改为 ConsoleOutput2
没有反映更改?
我预计:
"s"
"s"
"s"
-- file changed and saved here --
"s2222222222"
"s2222222222"
"s2222222222"
Autofac 不提供也不拥有配置生成器。不是 "Autofac's reloadOnChange
",是 "Microsoft.Extensions.Configuration's reloadOnChange
."
Autofac 将读取以该格式提供的配置,但是,一旦构建了容器,就是这样。容器内容和之后的配置之间没有 "tie" 或任何东西。
容器实际上是不可变的。 Updating the container is being removed for a variety of reasons 这也是容器未在配置更改时重建的相同原因。
如果您需要更改配置更改的内容,您需要在您的应用程序代码中执行此操作。
- 捕捉指示变化的事件
- 构建一个全新的容器
- 将新容器换成旧容器
说起来容易做起来难,尤其是当应用程序 运行 并且其中可能包含对从旧容器解析的对象的引用时。这实际上是不支持的一个重要原因。我没有关于如何实现这一点的指导,并且会积极反对它。
同样,check out this discussion if you're interested in more on why containers are immutable.