对于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"发布于 2019-06-23 15:56:18
Autofac不提供或拥有配置生成器。这不是“Autofac的reloadOnChange",而是”Microsoft.Extensions.Configuration的reloadOnChange“。
Autofac将读取以该格式提供的配置,但是,一旦容器构建完毕,就这样了。在容器内容和之后的配置之间没有“绑定”或任何东西。
容器实际上是不可变的。由于各种原因,正在删除更新容器。和相同的原因--容器没有在配置更改时重新构建。
如果需要更改配置更改的内容,则需要在应用程序代码中这样做。
这说起来容易做起来难,特别是在应用程序正在运行的时候,而且东西可能保存着从旧容器解析的对象的引用。这实际上是这个不被支持的一个重要原因。我对如何做到这一点没有指导,我会积极反对。
https://stackoverflow.com/questions/56708984
复制相似问题