2012-02-17 60 views
0

我創建了一個使用Prism和Unity作爲容器的WPF應用程序。有幾次,我注意到了註冊類型的順序,我註冊的類型(ViewModel到視圖構造函數)已經由Unity自動創建。然後我嘗試使用ContainerControlledLifetimeManager()註冊該類型,並且認爲我創建了一個單例。然而,自動創建意味着視圖模型的多個實例。棱鏡和統一 - 防止自動創建類型

除了明顯的解決方案,不是一個muppet,也沒有做到這一點,有沒有辦法阻止Unity自動創建未註冊的類型,並可能拋出異常呢?

回答

1

爲每個ViewModel定義一個接口,然後相應地註冊它們。

public interface IViewModel 
{ 
    List<IUser> Users { get; } 
} 

public class ViewModel : IViewModel 
{ 
    List<IUser> Users { get; } 
} 

Container.RegisterType<IViewModel, ViewModel>(); 

在你的構造確保接口類型被注入,而不是具體的類型,統一肯定會建造一個具體類型的實例,因爲它是解析;而一個接口可以有N個實現。

另外,你的代碼應該被構造成需要在應用程序中存在的數據應該來自服務而不是ViewModel。使你的ViewModel不是你的方法,通過服務來代理數據。這樣你的ViewModel可以隨意構建/銷燬,你想要保存的數據存在於別處。

Container.RegisterType<IService, Service>(new ContainerControlledLifetimeManager()); 
Container.RegisterType<IViewModel, ViewModel>(); 

... 

public List<IUser> Users 
{ 
    get { return Container.Resolve<IService>().GetUsers(); } 
} 
+0

感謝您的迅速響應。我一般不會爲創建視圖模型的接口而煩惱,因爲我不明白這一點,因爲它們與它們提供數據上下文的視圖相關聯。我已經看到了一些利弊,但對我來說它的矯枉過正。也許我需要重新考慮這一點。那麼沒有配置選項? – pilsdumps 2012-02-17 21:39:16

+0

如果你註冊一個給定的類型;它默認爲瞬態生命週期。使用'ContainerControlledLifetimeManager'肯定會提供單例行爲,但是您不希望通過ViewModel來做到這一點。請記住,ViewModel可以在多個視圖中使用。此外,它還允許您以相當平凡的方式替換測試或其他方式的具體類型。創建具體類型實例的Unity是不可配置的,我知道這是容器的行爲。單例示例應該可以工作,需要使用代碼來了解您的示例。 – 2012-02-17 21:45:01

+0

Container.Resolve ()是一個可怕的做法! 通過服務代理數據是非常好的建議! – aateeque 2014-07-22 09:36:09