2011-05-16 140 views
3

我正在使用棱鏡view-based navigation與RequestNavigate方法。Prism的RequestNavigate視圖註冊詳細程度的解決方法?

我encouner的問題是,我必須註冊所有容器中的ViewModels:

container.RegisterType<object, InboxView>("InboxView"); 

這是非常詳細,並要求我要註冊的所有視圖類型的列表。
它有任何解決方法嗎?

我覺得RequestNavigate應該是通用的:

IRegion.RequestNavigate<TView>(); 

並應執行以下操作:

  1. 解析View
  2. 給視圖的名稱應該是typeof(TView).Name區域
  3. 執行實際的導航請求:)
  4. Ple在棱鏡問題列表中對my suggestion摘要進行投票。
+0

是你的問題,你必須註冊所有視圖模型或所有視圖?你的例子並不清楚。除此之外,不需要映射名稱「InboxView」作爲RegisterType 的參數。 – PVitt 2011-05-16 11:52:57

+0

@PVitt,是的。那是我的問題。我希望這些映射是自動化的,實際上我正在考慮通過繼承區域並重寫或映射RequestNavigate方法(在其中添加視圖註冊表)(IUnityContiner將注入其構造函數),您怎麼看?順便說一句,我已經向Prism codeplex網站發佈了一個[建議](http://compositewpf.codeplex.com/workitem/8255),請查看/投票。 – Shimmy 2011-05-17 19:32:38

+0

@Shimmy:對於具體的類型,你不必做一個RegisterType來允許容器實例化它。但是,出於某種原因,您正在映射所有請求以將「object」類型的對象實例化爲InboxView類型。我會直言不諱地說,如果你必須這樣做,那麼你做錯了什麼。 – 2011-05-20 00:33:17

回答

0

我明白你在想什麼,但是提出的解決方案並沒有真正滿足RegionManager的設計目標。特別是:

  1. 區域請求是類型不可知的。如果您沒有對模塊B中的模塊A中的某個類型的引用,但想要在那裏導航,那麼如何在沒有這些模塊相互引用或將這些類型重構爲第三個程序集的情況下進行導航?
  2. 根據需要,區域可以有多個特定類型的視圖。您提出的解決方案會將特定類型的視圖數量限制爲一個,這並不是區域的工作方式。

雖然這並不回答你的問題。

至於減少冗長度,除了在RegionManager前封裝您想要的行爲的自己的解決方案之外,您可以做的不多。就我個人而言,我不會走這條路,但它肯定是你可以做的。您可以將其作爲您自己的服務編寫,或者只是IRegionManager或IRegion上的擴展方法。

public interface IMyNavigationService 
{ 
    //Your own implementation could use (typeof(T)).Name (or 
    //AttributedModelServices.GetContractName(typeof(T)) if using MEF) 
    //as the Key, if thatis appropriate for your solution 
    //(1 instance T per region and references to T from all Modules) 
    void RequestNavigation<T>(); 
} 

它看起來像一個開關,以MEF作爲IoC容器可以幫助您的需求...它只是取決於它的幾行代碼,你不關心的。對我而言,我不喜歡RegisterType<object, InboxView>。在MEF相當於是:

[Export] 
public class InboxView { .. } 

你可以在這裏提供一份合同名稱([Export("InboxView")]),但默認情況下它會提供的AttributedModelServices.GetContractName(typeof(InboxView))合同名稱。只要您選擇的內容與您選擇在IMyNavigationService的實現中生成名稱的方式一致,它應該可以正常工作。

下面是同樣的事情,但是使用擴展方法實現(使用MEF實現...如果您使用Unity,您可以選擇一些其他密鑰生成方法...你只需要添加該類型的登記方法以及)

public static class RegionExtensions 
{ 
    public static void RequestNavigate<T>(this IRegion region) 
    { 
     region.RequestNavigate(AttributedModelServices.GetContractName(typeof(T))); 
    } 
} 

如果您擔心切換一切MEF,有MefContrib project,使這更簡單...它基本上結合了團結和MEF在一個。

希望這會有所幫助。