我正在开发使用MVVM模式WPF应用程序。我使用MVVM光库,我还试图用一个依赖注射器(我考虑Ninject和Unity)。

我已经读了很多博客文章,我很困惑的让我的班,相互沟通的“正确”的方式。特别是,我不知道什么时候使用依赖注入,当依靠调解模式。

让我们考虑一个例子。我有一个视图模型,让我们把它叫做DataViewModel,并提供某种数据的数据类。 更好它是如何在它们之间通信:

一个。注入依赖于DataViewModel与IData的的接口?这样的数据将不必依赖于Messenger的,但它必须提供一个事件,如果数据发生变化,并且视图模型将不得不订阅。

B中。依靠模型和视图模型之间的调停图案(MVVM光实现为信使)和发送消息?这样,就没有必要使用依赖注入可言,因为整个通信将基于消息。

在其他的ViewModels此外,应我的ViewModels注入了依赖,或者倒不如只是依靠信使?如果第一,有必要定义每个视图模型一个单独的接口?我认为,定义每个虚拟机的接口将是一个额外的工作,但也许是值得的。

有帮助吗?

解决方案

通常视图模型进到服务(如棱镜称之为)来检索它需要的数据。这项服务被推向通过DI视图模型(构造函数注入),虽然你可以通过服务定位器执行这个法子。

因此你的视图模型将举行到的服务的参考,其将抽象掉数据的检索。这些数据可以从数据库,XML文件,谁知道现身...抽象是存在的。因此,对于你的IData的情况下,参照该类型将发生在视图模型的一些点,但不受任何来自DI的方式。如果你的IoC框架允许它(棱镜一样)创建的接口类型,具体类型的映射,然后通过检索你的容器那些类型;这样与统一的情况。

下面是一个简单的例子...脚本被绑定到视图和视图模型被注入到观。注意使用IScriptService的检索数据。数据回来是的iScript类型的集合,但是我们从来没有正式注入该类型到视图模型,因为我们不关心类型,我们所关心的一个宏伟规模型的单一实体。

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

当你用自己的方式查看,同样的情况下,可曾有,查看将获得通过DI(构造函数注入)与视图模型注入。我不会让其他的ViewModels互相依赖,让他们隔离。如果你开始看到需要耦合看看你要分享的数据,更多的时候则该数据需要被进一步,而不是抽象出来成为连接到任何视图模型。

其他提示

有一个以上的良好的解决问题的方法,

我建议你使用一些单一界面的数据模型,把它放在一个基类,这个接口可以让你的数据对象与外界沟通。

有关视图模型不注入数据,但可以为您检索数据的接口,数据将暴露事件的VM可以给他们注册,他得到后他们。

oject不应该知道谁拥有他的数据,视图模型知道他拥有什么样的数据,但我不建议注入该数据由于灵活性的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top