Castle Windsor更新实例属性

时间:2016-02-25 23:46:16

标签: c# dependency-injection castle-windsor

我正在尝试使用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

2 个答案:

答案 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(),容器将从此为您提供新实例。