- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我进行了广泛的搜索,但找不到任何关于如何使用具有多层 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);
}
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;
}
}
关于使用 Unity 进行 MVVM 依赖注入(inject),用于分层 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664910/
在 Django 中如何处理分层 URL?有什么最佳做法吗?例如。如果我有一个像 /blog/category1/category2/myblogentry 这样的 URL(使用例如 django-m
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
有没有办法在 R 中创建这样的图表? 以下是图表中显示的数据的摘录: df % group_by(Animal) %>% unite(col=Type, Animal:Name, sep =
我一直在努力处理一些时间戳数据(直到现在才需要处理日期,并且它表明)。希望您能帮忙。 我正在处理来自网站的数据,该数据显示每个客户 (ID) 各自的访问以及这些访问的时间戳。它的分组是指一个客户可能有
我一直在努力处理一些时间戳数据(直到现在才需要处理日期,并且它表明)。希望您能帮忙。 我正在处理来自网站的数据,该数据显示每个客户 (ID) 各自的访问以及这些访问的时间戳。它的分组是指一个客户可能有
我正在尝试完成这段代码: ORDER BY IF(j.groups IS NULL OR j.groups = '', IF(j.title IS NULL, i.title), j.groups)
我有一个非常抽象的问题,因为我不确定如何提出它。我的其中一个 View 上有一个 UIImageView。我想让 ImageView 看起来“压入 super View ”。我不确定技术术语是什么,但
我希望 100% 宽的包含图像的 div 位于我的页面下方。在这些 div 之上,我想要一个 1210 像素宽的 div,我可以在其中放置我的内容。 例子: http://mudchallenger.
我目前正在做一个类似于 http://www.beoplay.com/Products/BeoplayA9#under-the-hood 的元素使用 Javascript、HTML5 和 CSS3。我
我想像上面那样创建图像缩略图..为此,我在下面创建了 XML activity_main.xml
我想知道是否可以定义一个分层 MapReduce 作业?。换句话说,我想要一个 map-reduce 作业,在 mapper 阶段将调用不同的 MapReduce 作业。可能吗?您对如何操作有什么建议
程序设计: A 类,实现较低级别的数据处理 类 B-E,为 A 提供更高级别的接口(interface)以执行各种功能 F 类,它是根据用户输入与 B-E 交互的 UI 对象 在任何给定时间只能有一个
CTE 对我来说有点新,所以我希望有人可以帮助我编写的以下内容将采用类别表并从中构建层次结构以进行显示。我知道这种事情一直被问到,但我认为我的排序情况使它有点独特。 我希望有一些使用 Hierarch
我有关于 的问题群 在聚类分析(层次聚类)中。例如,这是 的完全链式的树状图。虹膜数据集 . 我使用后 > table(cutree(hc, 3), iris$Species) 这是输出 : se
数据 我有以下(简化的)数据集,我们称之为 df从现在开始: species rank value 1
Delphi 2009 中的分层窗口和系统菜单存在问题。也就是说,我们的分层窗口(没有边框)没有系统菜单。当我说系统菜单时,我指的是单击应用程序的图标、右键单击其标题栏或(在 Windows 7 中,
我正在制作一个 pototype HMTL5 Canvas 动画,该动画将导出到 Quicktime。 我有一个动态生成的背景,上面有动态屏蔽的元素。 我可以获取要制作的背景,并将其作为逐帧动画(pn
好吧,我有一个打印棋盘的类和另一个打印国际象棋的类 如何使用 LayeredPane 将它们合并在一起,如上面的示例图片所示?我一整天都在尝试,但似乎没有任何效果。我正在使用 JFrame 打印图片。
这是我的场景。我有两个类(class) ClassA 和 ClassB。 B类继承A类。 我在它们两个上使用@Component注释来使它们成为Spring bean。 @Component publ
这不是一道问题题,而是一道使用工具——leiningen——的题。 在一个主项目下创建分层的 lein 项目是否有优势,如果有,优势是什么? 如果我使用 lein new bene-cmp 创建一个项
我是一名优秀的程序员,十分优秀!