温莎城堡更新实例属性
本文关键字:实例 属性 更新 城堡 | 更新日期: 2023-09-27 18:36:20
我正在尝试使用温莎城堡来重用我的WebApp设置类的单个实例(MySettings
)。此设置很少更改,但是当它更改时,我需要更新容器中的实例。我可以轻松跟踪设置何时更改,但我无法找到正确的方法,有人可以帮助我吗?
温莎安装程序类如下:
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
?
我认为您想要的是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()方法中,你可以创建一个全新的实例,使用。 _settings = new MySettings()
,容器将从此为您提供新实例。
我还没有答案。我已经这样做了,它正在工作:
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;
}
}