【问题标题】:Mvvm - How to get the instance key in SimpleIoCMvvm - 如何在 SimpleIoC 中获取实例密钥
【发布时间】:2017-08-23 09:16:23
【问题描述】:

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

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

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

我知道我可以在 ContextViewModel 上创建和设置自定义属性,但由于我的班级需要这个值才能工作,我不喜欢我可以获得此视图模型的“非操作实例”的想法.

编辑更多信息,解释为什么我希望我的 ViewModel 实例知道它的标识符:

这是一个 Xamarin.iOS 应用程序(ViewController 由故事板创建)。

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

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

我可以通过在我的视图控制器的 ViewDidLoad() 方法中获取我的 ViewModel 实例并在其上调用一些 Setter 来使其工作,但我不喜欢这样(也许我错了 :))因为在我的请注意,IoC 应该只返回操作实例(无需调用多个 setter)。

最好的问候。

【问题讨论】:

  • 我不明白你在做什么。为什么实例应该知道(并关心)它的实例密钥?
  • 好吧,也许我做错了,但在我的应用程序中,我有同一个视图控制器的多个实例,因此,我需要为每个视图控制器实例使用不同的 ViewModel 实例。由于我的 ViewModel 需要一个 id 来从数据库中获取一些数据,我想我也会使用这个标识符作为实例标识符。
  • 啊,棘手...你能说明它们之间的关系吗?您的 ViewController 类是否有 ViewModel 字段?你如何创建你的 ViewController?我可以想象,如果您通过 ctor 参数将 viewmodel 注入到 viewcontroller 中,您可以在 viewmodel 上的该 ctor 中设置一个字段,因此当控制器开始运行时它将被完全初始化......你能关注我吗?
  • 我知道,但我忘了确切地说这是一个 Xamarin.Ios 应用程序,因此视图控制器由情节提要实例化。我相应地更新了我的问题。谢谢

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


【解决方案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; }
}

【讨论】:

    【解决方案2】:

    似乎无法在本地获取实例 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; }
    }
    

    在服务定位器中:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多