我应该依赖注射吗?我该怎么做?

时间:2012-09-06 23:56:30

标签: wpf dependency-injection prism

好的,我正在使用MVVMC(或MVCVM)模式在WPF中使用Microsoft Prism。

在我的ChatModule中,我有一系列Views,ViewModel和一个Controller。

对于我有的观点

  • ChatAreaView - 显示要读取的聊天消息。它托管在一个TabControl区域内,这样我就可以在用户和其他用户之间建立聊天窗口,或者可能是文件传输窗口等。
  • UserAreaView - 这是用户列表。右键单击具有上下文菜单以与它们进行交互...就像发送文件或窃窃私语一样。
  • MessageAreaView - 这是用户键入要发送给所有其他人的消息的地方。

对于每个视图,我都有一个相应的ViewModel。 ChatAreaViewModel,UserAreaViewModel和MessageAreaViewModel 。这些ViewModel基本上只包含属性。

例如,UserAreaViewModel定义了User类型的结构,它基本上只是一个Name。实际上这是在课外定义的,但仍然......它使用它。它有一个ObservableCollection来存储当前连接的所有用户的列表。它还定义了与用户交互的ICommand属性。现在我有SendFile,Whisper和Nudge ......意图在未来增加更多。

Controller创建这些视图和ViewModel,并将它们结合在一起。它将它们新闻化,将ViewModel指定为相应的View的DataContext,并设置ViewModel的所有初始属性。在模块的生命周期内,它将对用户交互做出反应,并执行已分配给每个ViewModel的ICommand属性的DelegateCommands。这些将进一步改变ViewModel中属性的状态。

我正在使用View和ViewModel的实际类型,而不是像这样的接口。

#region Views

ChatAreaView viewChatArea;
UserListView viewUserArea;
MessageView viewMessageArea;
LoginPromptView viewLoginPrompt;

#endregion

#region ViewModels

ChatAreaViewModel viewModelChatArea;
UserAreaViewModel viewModelUserArea;
MessageAreaViewModel viewModelMessageArea;
LoginPromptViewModel viewModelLoginPrompt;

#endregion

如果我为Views和ViewModel定义了接口,并且在控制器内的这些接口上操作而不是具体的实现,那么事情会变得更整洁,更少耦合吗?那么我可以在Module类中注册它们的Container(它本质上是每个模块的根目录吗?)

这样做我有什么好处?我如何为每个视图实现一个界面,以区别于其他视图?除了拥有XAML之外,他们并没有真正做任何事情...而且除了具有某些属性之外,ViewModel并没有真正做任何事情。这些属性可能会有所变化。例如,在UserAreaViewModel上,我肯定希望添加更多命令,以便用户可以通过不同方式与其他用户进行交互。

有人可以帮助我吗?在我看来,我认为我应该抽象这些东西,但我真的不知道我应该采用什么逻辑方式,或者即使这样做是明智的。我有什么收获?

感谢您的时间。下图是我正在研究的一个例子。忽略添加新项目按钮和所有内容的样式......这不是我现在正在处理的内容。

Chat Application

1 个答案:

答案 0 :(得分:0)

  1. 松散耦合 - 将来可以用完全不同的实现替换整个类。
  2. 独立开发..可以注入虚拟UI /视图,直到最终UI准备就绪。两件可以同时发展(在签订共同合同之后)。
  3. 无需添加对模块的引用(实现视图)。可以使用ConfigurationModuleCatalog从配置文件中发现类型。