2017-08-23 27 views
4

我在一個Xamarin項目中使用mvvm light SimpleIoC並使用實例鍵獲取一些視圖模型。Mvvm - 如何在SimpleIoC中獲取實例密鑰

SimpleIoc.Default.GetInstance<ContextViewModel>("contextIdentifier"); 

有沒有辦法在構造函數中獲取實例本身中的其他依賴關係?

我知道我可以在我的ContextViewModel上創建和設置一個自定義屬性,但是由於我的類需要這個值才能工作,我不喜歡這種觀點模型的「非操作實例」。

編輯與更多的信息,解釋爲什麼我希望我的視圖模型實例知道它的標識:

這是一個Xamarin.iOS應用(ViewController是由故事板創建)。在我的應用程序中,我有相同的視圖控制器的多個實例(和在同一UITabBarController),所以,我需要爲每個視圖控制器實例不同的ViewModel實例。

由於我的ViewModel需要一個ID來從數據庫中獲取一些數據,我以爲我會用這個標識符作爲實例標識符。

我可以通過在我的視圖控制器的ViewDidLoad()方法中獲取我的ViewModel實例並調用一些Setters,但我不喜歡這個(也許我錯了:)),因爲在我的想法是,IoC應該只返回操作實例(不需要調用多個setter)。

此致敬禮。

+1

我不明白你在做什麼。爲什麼實例需要知道(並關心)其實例密鑰? – Fildor

+0

好吧,也許我做錯了,但在我的應用程序,我有相同的視圖控制器的多個實例,所以,我需要爲每個視圖控制器實例不同的ViewModel實例。由於我的ViewModel需要一個id來從數據庫中獲取一些數據,我想我也會使用這個標識符作爲實例標識符。 – n3k

+0

啊,棘手......你能證明它們是如何相關的嗎?你的ViewController類是否有ViewModel字段?你如何創建你的ViewController?我可以想象,如果你通過ctor param將viewmodel注入到viewcontroller中,你可以在viewmodel中的ctor中設置一個字段,所以當控制器運行時它將被完全初始化......你能跟着我嗎? – Fildor

回答

1

這似乎是不可能得到實例ID本身,所以爲了確保我的情況是完全operationnal,並避免在我的ViewController呼籲制定者,我最終的接口添加到我的看法模型並直接在我的ServiceLocator中設置實例ID。

public interface IIdentifiableViewModel 
{ 
    /// <summary> 
    /// Gets or sets the instance key. 
    /// </summary> 
    /// <value>The instance key.</value> 
    string InstanceKey { get; set; } 
} 

在服務定位:

public class ServiceLocator 
{ 
    /// <summary> 
    /// Gets the view model instance by key and pass it to the InstanceKey property 
    /// </summary> 
    /// <returns>The view model by key.</returns> 
    /// <param name="key">Key.</param> 
    /// <typeparam name="T">The 1st type parameter.</typeparam> 
    public T GetViewModelByKey<T>(string key) where T : IIdentifiableViewModel 
    { 
     var vm = ServiceLocator.Current.GetInstance<T>(key); 
     ((IIdentifiableViewModel)vm).InstanceKey = key; 

     return vm; 
    } 

隨意,如果你有一個更優雅的或內置的解決方案來回答。

1

我不認爲有一種方法可以在構造函數中訪問該ID。該ID在SimpleIOC內部註冊。我只需創建一個新類型的ViewModel併爲其添加一個InstanceID屬性。

var viewModel = SimpleIoc.Default.GetInstance<MyViewModel>("contextIdentifier"); 
viewModel.ID = "contextIdentifier"; 

public class MyViewModel : ViewModelBase 
{ 
    public string ID { get; set; } 
}