温莎城堡更新实例属性

本文关键字:实例 属性 更新 城堡 | 更新日期: 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;
    }
}