2014-01-28 189 views
2

有一個問題找到直接的答案,雖然這可能很失敗,我的一部分搜索正確的條款。Caliburn Micro IoC.Get

我想知道的是,在caliburn使用IoC.Get();返回對該現有對象的引用,以及(我假設)如果沒有該對象的實例IoC將創建一個

另外,如果我是通過新手動創建實例,並且稍後使用了ioc,該怎麼辦。得到,這將返回我手動創建的同一個實例還是一個新的?

我問的原因是這樣的,我正在寫一個WPF應用程序,並且即時使用IoC.Get最初加載我的viewmodels,現在由於重新設計,我希望能夠創建一組全新的視圖,所以我的父視圖模型看起來與此類似:

 public ProjectContainerViewModel() 
    { 
      _containersListModel = IoC.Get<ContainersListViewModel>(); 
      _orderedItemListModel = IoC.Get<ItemsOrderedViewModel>(); 
      _packageListModel = IoC.Get<PackagesListViewModel>(); 
    } 

我能,而不是創建一個使用_containersListModel =新ContainersListModel這裏新實例()。從那時起IOC獲得同樣的實例?

編輯: 我使用這裏找到引導程序:https://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper

它定義了容器,我也是在類的開始標誌着我與[導出(typeof運算(ContainersListViewModel))]的ViewModels。

+0

如果您「新建」了一個新實例,IoC容器將不會有任何知識,除非您添加(或更改)其中一個綁定。另外,取決於綁定,您可能會每次調用IoC.Get()或新的實例(單例),這取決於實現的綁定方式。 1)你在DI容器中使用什麼(例如Caliburn.Micro的SimpleContainer或其他)? 2)你如何創建容器的綁定(或者你讓它「自動」解析)? – Steve

+0

另外,你說你想「創建一組全新的視圖」 - 這與viewmodels無關。你想創建一套新的視圖模型?只要確保IoC容器沒有返回單例,然後再次調用'IoC.Get()'來獲得一個新的。 – Steve

+0

我使用的是CM入門東西的一部分的CompositionContainer,視圖模型也標有[Export(typeof(ContainersListViewModel))]。所以要回答你的問題,我不確定它現在做什麼,這就是爲什麼我問,因爲我找不到:( – Ben

回答

4

Caliburn Micro中IoC的默認實現是一個簡單的「新」,但IoC是一個可以插入(也可能需要)自己的IoC容器的擴展點。爲了做到這一點,你必須重寫你的引導程序如下功能:

  protected virtual void BuildUp(object instance); 

     protected virtual object GetInstance(Type service, string key); 

,並將其寫入使用您的首選IoC容器構建的對象。 即使你覺得在第一步中你不需要IoC容器,調用IoC.Get來構建你的對象將會使你的代碼在未來更容易移植。