- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 MVVM 模式开发 WPF 应用程序。我正在使用 MVVM Light 库,并且我也在尝试使用依赖注入(inject)器(我正在考虑 Ninject 和 Unity)。
我已经阅读了很多博客文章,我对让我的类(class)相互交流的“正确”方式感到很困惑。特别是,我不知道什么时候使用依赖注入(inject),什么时候依赖中介模式。
让我们考虑一个例子。我有一个 ViewModel,我们称之为 DataViewModel,以及提供某种数据的 Data 类。
他们之间如何更好地沟通:
A. 使用 IData 接口(interface)注入(inject)对 DataViewModel 的依赖?这样 Data 就不必依赖 Messenger,但如果 Data 发生变化,它必须提供一个事件,并且 ViewModel 必须订阅它。
B. 依赖中介者模式(在 MVVM Light as Messenger 中实现),在 Model 和 ViewModel 之间发送消息?这种方式根本不需要使用依赖注入(inject),因为整个通信将基于消息。
此外,我的 ViewModel 是否应该在其他 ViewModel 上注入(inject)依赖关系,还是仅仅依赖 Messenger 会更好?如果是第一个,是否有必要为每个 ViewModel 定义一个单独的接口(interface)?我认为为每个 VM 定义一个接口(interface)将是一项额外的工作,但也许值得。
最佳答案
通常,ViewModel 会转到 Service(正如 Prism 所说的那样)来检索它需要的数据。该服务通过 DI(构造函数注入(inject))推送到 ViewModel,尽管您可以通过 ServiceLocator 以另一种方式执行此操作。
因此,您的 ViewModel 将持有对服务的引用,该服务将抽象您的数据检索。数据可能来自 DB、XML 文件,谁知道呢……抽象就在那里。因此,对于您的 IData 情况,对该类型的引用将在 ViewModel 中的某个点发生,但不会通过 DI 的任何方式发生。如果您的 IoC 框架允许(Prism 允许),您可以创建接口(interface)类型到具体类型的映射,然后通过容器检索这些类型; Unity就是这种情况。
这是一个简短的示例...脚本绑定(bind)到 View ,并将 ViewModel 注入(inject)到 View 中。请注意使用 IScriptService 检索数据。返回的数据是 IScript 类型的集合,但是我们从未将该类型正式注入(inject)到 ViewModel 中,因为我们不关心作为单个实体的类型,而是在更大范围内关心类型。
public ScriptRepositoryViewModel(IUnityContainer container, IScriptService scriptService, IEventAggregator eventAggregator)
{
_container = container;
_scriptService = scriptService;
_eventAggregator = eventAggregator;
}
public ICollectionView Scripts
{
get
{
if (_view == null)
{
_view = CollectionViewSource.GetDefaultView(_scriptService.Scripts);
_view.Filter = Filter;
}
return _view;
}
}
关于wpf - MVVM : Communication between the Model and ViewModels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207569/
我有兴趣了解有关 Microsoft Office Communicator 的更多信息IM 客户端,以及它如何确定您的存在(即您是在计算机旁还是不在)。任何人都可以向我指出解释这一点的教程或 API
我正在使用 python。我正在尝试运行一个进程并使用 subprocess.popen 获取输出。阅读周围后,我看到人们使用 communicate()[0] 但那不在文档中,它用于示例。我想知道是
我正在使用 python。我正在尝试运行一个进程并使用 subprocess.popen 获取输出。阅读周围后,我看到人们使用 communicate()[0] 但那不在文档中,它用于示例。我想知道是
我有一些设置和拆卸脚本,它们使用 csrun.exe 为一些自动化测试准备本地计算模拟器。 C:\Program Files\Microsoft SDKs\Azure\Emulator\csrun.e
我想知道对这句名言最接地气的解释是什么: Don't communicate by sharing memory; share memory by communicating. (R. Pike) 在
(所以 this question has been asked before ,但在一般意义上,大多数响应都是在与多个服务器/客户端/等的一般网络通信的上下文中) 在简单的点对点通信协议(proto
我正在尽力将 C++ 模块链接到 python 绑定(bind)。我正在努力实现 boost mpi 通信。我正在将 boost.mpi.world 对象发送到 C++,它需要一个 boost::mp
情况是这样的: 我有一个正在运行的命令: import subprocess foo = subprocess.Popen('ls /', shell=True, stdout=subprocess.
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 5 年前。 Improve
我曾与那些与同龄人在线聊天的人一起工作,他们不断地围绕想法进行讨论。我也曾与那些坚决拒绝并认为这是浪费时间的人一起工作。 在线实时聊天论坛对您特别有用吗?为什么或者为什么不? 在您的公司内部,还是在外
我在一个分为两组的 IT 部门工作。一组开发和管理应用程序,另一组管理公司的基础设施和服务器。我们面临的问题之一是沟通中断。我为应用程序组工作,我遇到的问题之一是当基础设施关闭服务器或刷新数据库时没有
我的团队与 IM 进行了很多交流。我们有时甚至会使用 IM 向在下一个立方体中的人提问。这样做的原因是我们都发现接听 IM 的干扰比说话要少得多。 尽管如此,我发现当我低头编码时,闪烁的消息窗口可能会
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 3年前关闭。 Improve t
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
传输数据时,汉明码显然允许您重新创建已通过线路损坏的数据(纠错码)。 这是如何工作的,它的局限性是什么(如果有的话)? 有没有更好的纠错解决方案(相对于重传)?是否存在重传更好的情况? 最佳答案 让我
我是一名优秀的程序员,十分优秀!