2016-11-12 53 views
0

如何打開使用簡單注入器注入依賴關係的新視圖/窗口?WPF使用簡單注入器打開新視圖

我可以用簡單的注射器啓動WPF應用程序,問題是:我怎麼能打開一個新窗口/視圖從我的窗口/視圖,其已經啓動

回答

1

這個問題是所有關於設計和簡單的噴油器只是composition root某處的實現細節。

我在這裏寫了另一個answer關於Windows窗體的類似問題的計算器。這個答案中的想法對於WPF來說並沒有什麼不同。

有幾種可能做到這一點取決於: - 有多少,除了主窗口,則需要Windows - 做其他的窗口也需要導航到其他窗口或其他窗口只能從主開窗戶 - 窗戶的生活方式是什麼。它通常是相當困難的。如果應用程序只是由幾個窗口和窗口可以有一個單身的生活方式,只是把所需要的窗口中創建一個用於應用

  1. 的完整生命週期真正的單窗口主窗口的構造函數。如果生活方式不能單身,你可以在每個窗口注入Func<T>工廠方法。
  2. 使組成根的第一個或主窗口部分。放入容器作爲構造函數參數,並在顯示它們之前直接從容器中解析其他窗口。在這種情況下,這個窗口的唯一責任就是打開/顯示應用程序窗口。
  3. 創建INavigationService與實現也構成根
  4. 的一部分使用的MVVM工具,如Caliburn Micro並直接重定向在卡利引導程序類GetInstance()方法簡單注射器容器
  5. 做一個完整的設計變化..

可能性1,2和4很容易實現。以最簡單的形式NavigationService也非常簡單,看起來是這樣的:

public class NavigationService : INavigationService 
{ 
    private readonly Container container; 

    public NavigationService(Container container) 
    { 
     this.container = container; 
    } 

    public void ShowView<TView>() where TView : Window 
    { 
     var view = this.CreateWindow<TView>(); 

     view.Show(); 
    } 

    public bool? ShowDialog<TView>() where TView : Window 
    { 
     var view = this.CreateWindow<TView>(); 

     return view.ShowDialog(); 
    } 

    private Window CreateWindow<TView>() where TView : Window 
    { 
     return this.container.GetInstance<TView>(); 
    } 
} 

如果我們將然而就這一換個角度,我們可以創建一個設計,在本質上,這設計處理的UI版本commandsqueries。這些模式將真正解決您的問題,無論是在商業層和UI方面。

在大多數LOB應用程序中,通常會打開一個屏幕以進行選擇或選擇,另一部分是讓用戶輸入數據並將其保存到某個數據存儲區的屏幕。如果我們從抽象層面考慮這個問題,那麼通過一塊UI來處理這個問題並不重要,以便讓用戶進行交互。我們可以將其視爲查詢或編輯某個服務的數據的服務。這可能是一個web服務,但也可以直接用戶。

定義一些簡單的接口,並使用MVVM設計模式,我們可以創建視圖模型的實現裏面做只是這:

public interface IEditViewModel<TEntity> 
{ 
    EditResult EditEntity(TEntity entityToEdit, DialogHandler dialogHandler); 
} 

public interface IChooseViewModel<TEntity> 
{ 
    TEntity ChooseEntity(DialogHandler dialogHandler); 
} 

public class ChooseEntityService 
{ 
    private readonly Container container; 
    private readonly DialogHandler dialogHandler; 

    public ChooseEntityService(Container container, DialogHandler dialogHandler) 
    { 
     this.container = container; 
     this.dialogHandler = dialogHandler; 
    } 

    public TEntity ChooseEntity<TEntity>() 
    { 
     var viewModel = this.container.GetInstance<IChooseViewModel<TEntity>>(); 
     return viewModel.ChooseEntity(this.dialogHandler); 
    } 
} 

在窗口需要選擇我們注入ChooseService客戶。該服務將找到正確的實現,並且DialogHandler將是一個實現,它顯示了您最喜愛的MVVM工具的視圖。

This answer更詳細地介紹了此設計。

相關問題