Mvvm - 如何在 SimpleIoC 中获取实例密钥
Mvvm - How to get the instance key in SimpleIoC
我在 Xamarin 项目中使用 mvvm light SimpleIoC 并使用实例键获取一些视图模型。
SimpleIoc.Default.GetInstance<ContextViewModel>("contextIdentifier");
有没有办法在构造函数中像其他依赖项一样在实例本身中获取此实例密钥?
我知道我可以在我的 ContextViewModel
上创建和设置自定义 属性,但是由于我的 class 需要这个值才能工作,我不喜欢我可以获取此视图模型的 "non-operationnal instance"。
使用更多信息进行编辑,以解释为什么我希望我的 ViewModel 实例知道它的标识符:
这是一个 Xamarin.iOS 应用程序(ViewController
由故事板创建)。
在我的应用程序中,我有多个相同视图控制器的实例(并且在同一个 UITabBarController
中),因此,我需要为每个视图控制器实例使用不同的 ViewModel 实例。
因为我的 ViewModel 需要一个 id 来从数据库中获取一些数据,所以我想我也会使用这个标识符作为实例标识符。
我可以通过在我的视图控制器的 ViewDidLoad() 方法中获取我的 ViewModel 实例并在其上调用一些设置器来使其工作,但我不喜欢这样(也许我错了:))因为在我看来,一个 IoC 应该只有 return 个操作实例(不需要调用多个 setter)。
此致。
我认为没有办法在构造函数中访问该 ID。该 ID 在 SimpleIOC 内部注册。我会简单地制作一种新型的 ViewModel 并向其添加一个 InstanceID 属性。
var viewModel = SimpleIoc.Default.GetInstance<MyViewModel>("contextIdentifier");
viewModel.ID = "contextIdentifier";
public class MyViewModel : ViewModelBase
{
public string ID { get; set; }
}
似乎无法本地获取实例ID,所以为了确保我的实例完全可操作,并避免在我的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;
}
如果您有更优雅或内置的解决方案,请随时回答。
我在 Xamarin 项目中使用 mvvm light SimpleIoC 并使用实例键获取一些视图模型。
SimpleIoc.Default.GetInstance<ContextViewModel>("contextIdentifier");
有没有办法在构造函数中像其他依赖项一样在实例本身中获取此实例密钥?
我知道我可以在我的 ContextViewModel
上创建和设置自定义 属性,但是由于我的 class 需要这个值才能工作,我不喜欢我可以获取此视图模型的 "non-operationnal instance"。
使用更多信息进行编辑,以解释为什么我希望我的 ViewModel 实例知道它的标识符:
这是一个 Xamarin.iOS 应用程序(ViewController
由故事板创建)。
在我的应用程序中,我有多个相同视图控制器的实例(并且在同一个 UITabBarController
中),因此,我需要为每个视图控制器实例使用不同的 ViewModel 实例。
因为我的 ViewModel 需要一个 id 来从数据库中获取一些数据,所以我想我也会使用这个标识符作为实例标识符。
我可以通过在我的视图控制器的 ViewDidLoad() 方法中获取我的 ViewModel 实例并在其上调用一些设置器来使其工作,但我不喜欢这样(也许我错了:))因为在我看来,一个 IoC 应该只有 return 个操作实例(不需要调用多个 setter)。
此致。
我认为没有办法在构造函数中访问该 ID。该 ID 在 SimpleIOC 内部注册。我会简单地制作一种新型的 ViewModel 并向其添加一个 InstanceID 属性。
var viewModel = SimpleIoc.Default.GetInstance<MyViewModel>("contextIdentifier");
viewModel.ID = "contextIdentifier";
public class MyViewModel : ViewModelBase
{
public string ID { get; set; }
}
似乎无法本地获取实例ID,所以为了确保我的实例完全可操作,并避免在我的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;
}
如果您有更优雅或内置的解决方案,请随时回答。