gpt4 book ai didi

使用 Unity 进行 MVVM 依赖注入(inject),用于分层 View 模型

转载 作者:行者123 更新时间:2023-12-03 10:17:40 26 4
gpt4 key购买 nike

我进行了广泛的搜索,但找不到任何关于如何使用具有多层 View 模型的依赖注入(inject)正确设计应用程序的良好指导。

当您的 View 模型需要创建需要创建其他 View 模型的 View 模型时,使用 Unity 之类的东西实现依赖注入(inject)的最佳方法是什么?

例如,假设我有一个带有 MainViewModel 的应用程序,我希望能够在 Visual Studio 的选项卡式界面中显示一堆不同类型的数据。

我使用名为 UsersViewModel 的 View 模型执行命令以打开用户对象的集合。此 View 模型在其构造函数中采用存储库 IUserRepository。调用 IUserRepository 上的 GetAll 方法来获取用户对象的集合,这些对象显示在 View 的网格中。

如果需要编辑特定 User 对象的详细信息,我需要创建一个 UserViewModel,它还采用 IUserRepository 的实例和其构造函数中特定 User 对象的 ID。调用 IUserRepository 上的 FindById 方法来获取特定的用户对象。

我需要在主视图的单独选项卡中显示用户详细信息。我需要能够同时查看/编辑多个用户对象的详细信息,所以我不能只以模态方式打开详细信息。因此,UserViewModel 需要能够持久保存自己的更改,因为在保存特定 UserViewModel 之前可能会关闭 UsersViewModel。

那么在这种情况下解决 UserViewModel 实例的最佳方法是什么?我可以将 IUnityContainer 的实例传递给 UsersViewModel,然后使用它来解决它们,但从我所读到的内容来看,这是一个坏主意。还能怎么做?

最佳答案

我已经用 Autofac 和 MEF 建立了一个 MVVM 应用程序来解决你所说的问题。长话短说,我创建了一个服务接口(interface)IViewModelProvider它为任意模型提供 ViewModels。此服务的实现为所有 ViewModel 提供缓存,并在找不到特定模型的请求 ViewModel 类型的 ViewModel 时为模型创建 ViewModel。
ViewModelProvider是一种它自己的 IoC 容器,它在初始化时反射(reflect)所有加载的程序集,然后在运行时解决依赖关系。 ViewModelProvider 为服务 IViewModelProvider 注册一个自身的实例因此可以将自身传递给 ViewModels这需要实例化新 ViewModel 的能力。

我对这个解决方案非常满意,因为我觉得在这里可以很好地分离关注点。全局 ViewModel 缓存很棒,因为它节省了资源,而且您实际上可以比较 ViewModel 的相等性,这是我经常遇到的。

正如您在问题中指出的那样,可以通过使用与 UI 相同的 IoC 容器来简化此解决方案。我同意通过 IUnityContainer 不是一个好主意直接到 ViewModels。不过,我看不出使用容器解析 ViewModel 有什么问题。我建议构建一个简单的服务,它缓存 ViewModel 实例并使用 IUnityContainer 创建新的 ViewModel。 .

以下代码是伪代码,混合了一点 MEF 和一点 Autofac 语法,但我认为它的含义很清楚:

获取 ViewModel 的接口(interface):

public interface IViewModelProvider
{
T GetViewModel<T>(object model);
}

导入 Unity 容器并将其用于解析尚未缓存的 ViewModel 的实现。 ViewModelCache类似于您必须自己构建的高级词典。
[Export(typeof(IViewModelProvider))]
public class ViewModelProvider : IViewModelProvider
{
private IUnityContainer _container;

private ViewModelCache _viewModelCache;

[ImportingConstructor]
public ViewModelProvider(IUnityContainer container)
{
_container = container;
}

public T GetViewModel<T>(object model)
{
if (_viewModelCache.Contains<T>(model))
return _viewModelCache.Get<T>(Model);

var viewModel = _container.Resolve<T>();
viewModel.Model = model;

_viewModelcache.Cache(viewModel);

return viewModel;
}
}

然后可以将该服务注入(inject)到您的 ViewModel 中,并且 ViewModel 可以创建自己的子 ViewModel 而不必关心这些是否已经存在或需要创建。

希望这可以帮助。这是一个广泛的话题,所以请询问您是否有任何特殊问题。

关于使用 Unity 进行 MVVM 依赖注入(inject),用于分层 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com