从 MVC(模型 - 视图 - 控制器)的角度来看这一点确实很有意义。(MFC 的命名是对 MVC 的敬意,这是微软的另一个恶作剧;在 MFC 中管理“真正的”MVC 中必需的抽象类型既困难又不直观(但绝不不可能)。)
具体来说,听起来您已经思考了 MVC 设计的基础;您拥有执行底层业务逻辑工作的类(模型),并且您知道它们应该与 UI 组件(视图)分开。现在出现的问题是 MVC 三位一体的第三部分;控制器。
MFC 显然故意混淆了 MVC 过程,让您从 Dialog 开始,从而使这些东西变得困难。在您的实例中,MFC 开始使用的对话框应该是控制器,而不是视图。您的对话框(控制器)正在为您做的是管理您的 UI 组件(视图)并允许它们与您的“工作”类(模型)进行交互。让这再次变得困难的是,您的 UI 组件要可见,很可能需要附加到您的 Dialog 才能可见。
为了正确处理这类事情,您实际上必须基本上将您的 Controller 实现为从 Dialog 实例化的高级对象;您的 Dialog 是初始控制流进入的地方,您的 Controller 获取控制流,从那里,它应该将 Dialog 视为另一个 UI 组件(尽管具有特殊状态)。
这使您可以拥有适当的封装级别;您的控制器调用您的业务逻辑(模型)类,它们可以相互通信或与控制器通信;它们被控制器从视图中分离出来,而不是嵌入到 UI 组件中,并且(可能)采用“简单的方法”对 UI 元素进行过度特权访问(“嗯,我需要这个对象从用户;我可以重构,但只是抛出一个对话框会容易得多,因为我有顶级窗口句柄......“)。
一旦您的 Controller 对象成为所有业务逻辑对象的所在地,事情就变得容易了;您可以使用 Controller 为需要其他对象的任何对象提供跨对象访问。考虑哪些类需要单例,并谨慎使用它们。需要争用管理的资源(例如硬件资源)是“自然单例”的绝佳示例;适合单例方法的东西。您也可以选择让您的 Controller 成为单例;取决于访问它的要求。具体来说,在您的依赖注入场景中,控制器是您实例化对象和管理依赖关系的地方。
这是基本的 MVC 方法;但是,就像我说的,由于 MFC 的基本设计,MFC 使它异常困难和不直观。由于 MFC,在最初对 MVC 产生了非常负面的印象之后,我对 MVC 有了更多的了解;如果可以的话,我建议您研究一下其他语言中的 MVC 实现是什么样的。
祝你好运!