2012-08-02 64 views
1

您好我目前使用WPF的模型/視圖模式和國際奧委會,但我有一個問題,我目前有3視圖,其中只有兩個將需要創建,在運行時確定。WPF MVVM與IUnityContainer創建不需要的多個實例

在每個視圖我使用的XAML以提供用於視圖中的對象,像這樣:

ViewA

<viewmodel:modelA x:Key="viewModel"/> 

ViewB

<viewmodel:modelB x:Key="viewModel"/> 

... etc

點此外,這些看法和他們的後續機型有這樣一個層次結構:

class modelA   { public virtual ConfigA {get; set;} } 
class modelB : modelA { public override ConfigB {get; set;} } 
class modelC : modelB { public override ConfigC {get; set;} } 

class ConfigA   { public int Test { get; set;} } 
class ConfigB : ConfigA { public int TestA { get; set;} } 
class ConfigC : ConfigC { public int TestB { get; set;} } 

現在國際奧委會我創造我的容器和註冊所需的模型(modelB或modelC)的一個實例。當試圖通過container.resolve實例化所需的視圖時,ViewA + ViewB或ViewA + ViewC。

我得到了模型的多個實例。

當我只想要創建一個類型,無論是modelB或modelC。

switch (Object) 
{ 
    case 1: 
    modelB b = new modelB(); 
    Container.RegisterInstance<modelB>(b, new ContainerControlledLifetimeManager()); 
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewB>()); 
    break; 
    case 1: 
    modelC c = new modelC(); 
    Container.RegisterInstance<modelC>(c, new ContainerControlledLifetimeManager()); 
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewC>()); 
    break; 
} 
RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<ViewA>()); 

的意見解決是產生更多的模型時,我要的是使用該模型的已建成實例,並注入到瀏覽此容器。任何人都可以幫助或點我在正確的方向,

感謝,

回答

1

我不是,如果im相當肯定在正確的軌道,但我會看看我是否能幫助反正。

望着查看/ ModelB情景我看你有沒有什麼方法是:

  1. 您與UnityContainer
  2. 註冊您的ModelB的單個實例您嘗試解決新ViewB
  3. 一創建ModelB的新實例而不是使用步驟1中的實例

當創建ViewB對象時,它會獨立於統一容器創建新的ModelB。 如果您希望您之前在使用的統一容器註冊ModelB的情況下,你可以把它當作ViewB的依賴性如

public class ViewB 
{ 
    public ViewB(ModelB model){ .. } 
} 

如果當您嘗試解決一個ViewB有這樣的設置,然後您先前註冊的ModelB將被傳入。

希望有所幫助!

+0

嘿斯科特多數民衆贊成在類似於我所做的,我會在下面解釋,謝謝。 – somin 2012-08-06 12:07:32

0

只是後來有人發現這一點,並想知道,我解決了這個問題,基本上取消了我的視圖中的視圖模型的靜態引用。

<viewmodel:modelB x:Key="viewModel"/> 

而作爲斯科特建議註冊第一類型,則該類型的一個實例,則解決我inherrited視圖並隨後基本視圖(其中,當在由DI容器中註冊的類型注入調用)。不幸的是,這意味着在VS2010中,我無法使用設計器在xaml中創建綁定,因爲我必須從視圖構造器中的代碼後面設置DataContext。

代碼:

UserControl view = null; 
    switch (runtimeSetArg) 
    { 
    case 1: 
     Container.RegisterType<modelA, modelB>(new ContainerControlledLifetimeManager()); 
     Container.RegisterInstance<modelB>(new modelB()); 
     view = Container.Resolve<viewB>(); 
     break; 
    case 2: 
     Container.RegisterType<modelA, modelC>(new ContainerControlledLifetimeManager()); 
     Container.RegisterInstance<modelC>(new modelC()); 
     view = Container.Resolve<viewC>(); 
     break; 
    case 3: 
     ... 
     break; 
    case default: 
     break; 
    } 

    if (view != null) 
    { 
    RegionManager.Regions[RegionNames.MainRegion].Add(Container.Resolve<viewA>());   
    RegionManager.Regions[RegionNames.MainRegion].Add(view); 
    } 

然後在後面的代碼的意見

public partial class ViewB: UserControl 
{ 
    public ViewB(IUnityContainer container) 
    { 
    this.DataContext = (ModelB)container.Resolve<ModelB>();  
    InitializeComponent(); 
    } 
} 

這一點,就像我說的,解決這個問題,但我希望有會一直使用更清潔的方式繼承的觀點和他們的模型。其中我仍在尋找,但如果這有助於任何堅持這一點的人,那麼很好。