Mvvm - 如何在SimpleIoC中获取实例密钥

时间:2017-08-23 09:16:23

标签: c# xamarin xamarin.ios mvvm-light simpleioc

我在Xamarin项目中使用mvvm light SimpleIoC并使用实例键来获取一些视图模型。

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

有没有办法在构造函数中像其他依赖项一样在实例本身中获取此实例键?

我知道我可以在我的ContextViewModel上创建和设置自定义属性但是因为我的班级需要这个值才能工作,我不喜欢我能得到一个“非操作实例”的想法查看模型。

使用更多信息进行编辑,以解释为什么我希望我的ViewModel实例知道其标识符:

这是一个Xamarin.iOS应用程序(ViewController是由storyboard创建的。)

在我的应用程序中,我有多个相同视图控制器的实例(并且在同一个UITabBarController中),因此,我需要为每个视图控制器实例使用不同的ViewModel实例。

由于我的ViewModel需要一个id来从数据库中获取一些数据,我想我也会使用这个标识符作为实例标识符。

我可以通过在我的视图控制器的ViewDidLoad()方法中获取我的ViewModel实例,并在其上调用一些Setter,但我不喜欢这个(也许我错了:))因为在我的记住,IoC应该只返回operationnal实例(不需要调用多个setter)。

最好的问候。

2 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:1)

似乎无法本机获取实例ID,因此为了确保我的实例是完全可操作的,并且避免在我的ViewController中调用setter,我最后将一个接口添加到我的视图模型并设置实例ID直接在我的ServiceLocator中。

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

在ServiceLocator中:

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;
    }

如果您有更优雅或内置的解决方案,请随时回答。