2015-08-26 50 views
1

我寫了一個WPF應用程序,它有兩個不同的主窗口。我不知道要在運行時啓動哪一個程序,只需查找數據庫中使用該程序的用戶是什麼類型。我目前的代碼有效,但Castle Windsor通過爲這兩種窗口創建對象圖來完成大量額外的工作。構圖根的可選依賴項

private readonly IMainWindow _mainWindow; 
    private readonly ISimplifiedMainWindow _simplifiedMainWindow; 

    public MainClass(
     IMainWindow mainWindow, 
     ISimplifiedMainWindow simplifiedMainWindow) 
    {    
     _mainWindow = mainWindow; 
     _simplifiedMainWindow = simplifiedMainWindow; 
    } 

    public RunApp() 
    { // pseudocode 
     if (user is fullUser) _mainWindow.Show(); 
     else _simplifiedMainWindow.Show(); 
    } 

如何推遲我的窗口對象的創建而不訴諸抽象工廠,基本上會重複Castle Windsor做什麼?

+0

相關:http://stackoverflow.com/questions/31950362/factory-method-with-di-and-ioc – NightOwl888

回答

1

工廠實際上是我推薦的解決方案(以及我過去成功使用多次解決這個問題的解決方案)。

雖然我不會實施工廠,但讓溫莎做到這一點(via a Typed Factory)。

public interface IWindowFactory 
{ 
    IMainWindow FullUserWindow(); 
    ISimplifiedMainWindow SimplifiedUserWindow(); 

    //optionally 
    void DestroyWindow(IWindow window); 
} 

現在,你只需要告訴溫莎建立一個工廠,該接口

container.AddFacility<TypedFactoryFacility>(); 
// later on, in your installer 
container.Register(Component.For<IWindowFactory>() 
         .AsFactory() 
         .LifestyleTransient()); 

和您的應用程序代碼的更改:

public RunApp() 
{ // pseudocode 
    if (user is fullUser) Show(factory.FullUserWindow()); 
    else Show(factory.SimplifiedUserWindow()); 
} 
+0

我很好奇你爲什麼想將工廠作爲LifestyleTransient而不是默認的單身人士? – reggaeguitar

+0

可能在根本上沒有區別。 –

+0

對於任何類型的工廠你不只是想要一個單身?由於溫莎城堡正在生成它,你不應該需要一個新的實例嗎?這不像是課堂上存儲的任何狀態,你對 – reggaeguitar