2016-02-25 84 views
0

我試圖使用Castle Windsor重新使用我的WebApp設置類(MySettings)的單個實例。 這個設置很少改變,但是當它改變時,我需要更新容器中的實例。 我可以很容易地跟蹤「設置」更改的時間,但我無法弄清楚正確的方法,任何人都可以幫助我嗎?Castle 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

我的答案在下面有幫助嗎?我認爲這將大大簡化您的代碼,如果它是你正在尋找:) – topher

+0

在你的解決方案中,我可以更新一個設置,但我需要重新加載MySettings。因爲我的設置可以在MVC CRUD中更新。所以主要的問題是:我可以更新一個單例實例嗎? – mqueirozcorreia

+0

如何訪問MySettings以更新它?如果您使用構造函數注入將其傳遞到控制器中,那麼只要您使用依賴注入來解析控制器,它就會每次都是相同的實例。 – topher

回答

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; 
    } 
} 

有沒有人有更好的主意?

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()方法,你可以創建一個使用 ​​一個完全新的,容器將從此成爲了新的實例爲您服務。