【发布时间】:2016-04-04 19:03:40
【问题描述】:
我有一个应用程序同时用作“客户端”和“服务器”来展示它们之间的单一通信。在这个应用程序中,我有一个名为“ClientConnectionService”的类,它包含客户端通信的所有方法:
public class ClientConnectionService : ConnectionModelBase
{
public string Connect()
{
//Some code here
}
public void OnDataReceived()
{
//Some code here
}
public virtual void WaitForData()
{
//Some code here
}
public void SendMessage(string msg)
{
//Some code here
}
public string Disconnect()
{
//Some code here
}
}
使用 MVVM,我为 2 个用户控件创建了一个视图和一个 ViewModel:ConnectToServerView/ViewModel 和 ViewUserView/ViewModel。
public partial class ViewUserView : UserControl
{
private ViewUserViewModel viewModel = new ViewUserViewModel();
public ViewUserView()
{
DataContext = viewModel;
}
}
public class ViewUserViewModel : ViewModelBase
{
private ClientConnectionService clientConnectionService
= new ClientConnectionService();
public ViewUserViewModel()
{
}
}
另一个 View/ViewModel 与上面的基本相同,所以我将跳过那个的代码(为简单起见)。
我知道这是错误的,因为当尝试访问 ViewUserViewModel 中“客户端”的套接字时,它显示为空(因为我没有调用“连接”方法,实际上我在其中设置了这个“客户端套接字”) ,因为“ClientConnectService”的这个实例与我在“ConnectToServerViewModel”中调用的实例不同。
TL;DR 我有 2 个 viewModel 和一个类的 2 个不同实例,我需要在这些(可能还有更多)viewModel 之间共享该实例(类的)。
我的问题是:依赖注入是否可行? (因为我一直在尝试实现它,但接口始终为空,所以我认为我遗漏了一些东西),或者有没有办法让这个“ClientConnectionService”类在我的所有 ViewModel 实例之间“共享”(或者至少是需要它们的人)
【问题讨论】:
-
看起来确实是使用依赖注入的好地方。你当然可以使用单例,但是你会在这里和那里一次又一次地添加它们,然后你最终会想要对事物进行单元测试......
-
这是一种方法。此外,ViewUserViewModel 是一种巨大的代码气味。不确定你到底在用它做什么,但你不应该用他们自己的视图模型来设计用户控件。这样想——TextBox 有绑定到它的 DataContext 的 TextBoxViewModel 吗? Grid 是否有 GridViewModel?通常,您的 ViewUserView 应该在其表面(例如,用户)上公开您绑定到实际视图模型的属性(例如,可能有一个名为 Users 的集合和一个绑定到此用户属性的属性 SelectedUser)。跨度>
-
@Will,感谢您的输入,但为了简单起见,我只是发布了视图模型的“基本框架”。我可以向你保证,我这样做是有原因的。
-
那种气味总是让我害怕。闻到就跑!
标签: c# wpf mvvm dependency-injection