【问题标题】:Is passing a view for an interface frown upon?传递接口视图是否令人不悦?
【发布时间】: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


【解决方案1】:

我真的不认为这会是一个问题,只要它不会以明显的不好的方式影响性能,或者当您开始添加更多时它在项目中看起来很奇怪更多关于 GUI 等的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2011-12-17
    • 2012-10-03
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2015-02-16
    • 2010-09-13
    相关资源
    最近更新 更多