【发布时间】:2020-05-01 22:29:12
【问题描述】:
假设您的模型或视图模型需要显示一条消息,但它显然不想访问 UI。所以它实现了一个具有 Notify(String) 方法的接口。
现在实现此接口的任何人都可以显示消息,并且该对象通常是基于 UI 的类,需要传递给模型或视图模型。
我的问题是,即使它只是作为接口传递,传递 UI 对象是否会令人不悦?
我已经用一个模拟示例说明了这个问题。
public interface INotify
{
void Notify(String msg);
}
class Model
{
INotify _notify;
public Model(INotify notify )
{
_notify = notify;
}
public void Add(int a, int b)
{
int result = a + b;
_notify.Notify("The result is " + result.ToString());
}
}
class View : INotify
{
public void Notify(String msg)
{
Console.Write("I am the view, I received this: ");
Console.WriteLine(msg);
}
}
class Program
{
static void Main(string[] args)
{
View view = new View();
Model model = new Model(view);
model.Add(4, 7);
}
}
结果如预期,关键是从视图打印出来的。
我是视图,我收到了这个:结果是 11 按任意键继续 。 . .
在现实世界中,view 类将是一个完整的 UI 类,如 windows 窗体或 wpf 等,但它仅在其实现的接口中传递到位。为什么视图被作为它实现的接口传递,这是否会令人不悦?
如果不被接受,这不正是界面的工作吗?在这种情况下,它的派生类毕竟应该是某种 UI 类来显示消息,而且它还有很多其他的东西。
我正在尝试了解接口的实际用途,并在 MVVC 或 MVVM 中的模型视图偶尔可能想要显示消息时解决它的问题。
另一种变体是实现完整的观察者模式,但在我的情况下,模型或视图模型只需要在一个窗口中显示消息(从不在多个窗口中),因此从逻辑上传递该视图以获得接口是有意义的。
【问题讨论】:
-
我认为模型中的
INotify没有问题,因为在许多方面它与模型中的日志接口相同——既可以输出某些内容,也可以将输出发送到磁盘而不是对于一个解耦的界面来说,屏幕既不是这里也不是那里。在 WPF/MVVM 中,一个常见的问题是从数据库加载或 WCF 客户端代码通常将服务注入到 VM 中。因此,根据这个先例,您可以将一些“UI 服务”注入您的虚拟机,以代表您完成 UI 请求 -
@MickyD 这让我感觉好多了。目标始终是模型视图不需要视图,但是当它不可避免或移植遗留代码时,模型视图可能想要报告错误或询问用户是/否问题,这很有意义。它仍然不知道视图,但视图确实作为接口传递,对我来说这听起来像是对接口的良好使用,但不确定这是否出于任何原因可能是坏事或违反 MVVM。
标签: c# model-view-controller mvvm observer-pattern