我正在尝试使用Castle Windsor重用我的WebApp设置类(MySettings
)的单个实例。
此设置很少更改,但是当它更改时,我需要更新容器中的实例。
我可以轻松跟踪设置何时发生变化,但我无法找到正确的方法,有人可以帮助我吗?
Windsor Installer类如下:
public class SettingsInstaller : IWindsorInstaller
{
private MySettings Settings { get; set; }
public void Install(IWindsorContainer container, IConfigurationStore store)
{
UpdateSettings();
container.Register(
Component.For<MySettings>()
.Instance(this.Settings));
}
public MySettings UpdateSettings()
{
using (DbContext db = new DbContext())
{
this.Settings = db.Settings.FirstOrDefault();
}
return this.Settings;
}
}
如何调用UpdateSettings()
并确保容器在下一个依赖注入解析中使用更新的Settings
?
答案 0 :(得分:0)
我还没回答。我已经这样做了,它正在发挥作用:
public class SettingsInstaller : IWindsorInstaller
{
private static MySettings Settings { get; set; }
public void Install(IWindsorContainer container, IConfigurationStore store)
{
UpdateSettings();
container.Register(
Component.For<MySettings>()
.UsingFactoryMethod(() =>
{
return SettingsInstaller.Settings;
})
.LifestyleTransient());
}
public static MySettings UpdateSettings()
{
using (DbContext db = new DbContext())
{
SettingsInstaller.Settings = db.Settings
.AsNoTracking()
.FirstOrDefault();
}
return SettingsInstaller.Settings;
}
}
有没有人有更好的主意?
答案 1 :(得分:0)
我认为你想要的是MySettings是一个单身人士,你的状态可以在应用程序的其他部分更新。如果将MySettings注册为单例,则只要容器为您解析MySettings,它就会返回相同的实例。这基本上就是你在答案中所做的,但你只是将实例存储在一个局部变量中(而不是让容器为你做这个)。
您的注册码可以变得非常简单:
public class SettingsInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<MySettings>().LifestyleSingleton());
}
}
每当您需要访问设置时,您可以使用构造函数注入(或从容器中获取实例的任何其他方法)从容器中请求MySettings:
public class ClientClass
{
private readonly MySettings _settings;
public ClientClass(MySettings settings)
{
_settings = settings;
}
public void UpdateSettings()
{
_settings.SomeSetting = myNewSetting; // reset them however you need to here
}
}
在某个地方调用了应用程序中的UpdateSettings()后,容器所持有的实例(单例)将使用myNewSetting进行更新,当下一个类请求MySettings时,您将获得相同的实例更新后的值。
如果您确实需要MySettings的新实例,那么在UpdateSettions()方法中,您可以创建一个全新的MySettings
_settings = new MySettings()
,容器将从此为您提供新实例。