Model view controller 控制器<-&燃气轮机;服务组件交互

Model view controller 控制器<-&燃气轮机;服务组件交互,model-view-controller,architecture,Model View Controller,Architecture,更新: 我有一个桌面应用程序,与以下组件交互: WinUI 服务(进程内C#类,其中包含实际执行业务逻辑) 控制器(协调UI引发的事件并调用服务方法的C#类) 如果控制器要求服务执行某些操作,但该服务首先需要从控制器获得更多的操作(即控制器必须使用UI从用户处获取的数据),该服务应如何让控制器执行此操作? 我对这个概念很满意 用户与 与进行通信的用户界面 与之通信的控制器 与进行通信的服务组件(不要与web服务或进程外服务混淆) 通信的数据/存储库 等等 但是,对于与服务通信的控制器,

更新:

我有一个桌面应用程序,与以下组件交互:

  • WinUI
  • 服务(进程内C#类,其中包含实际执行业务逻辑)
  • 控制器(协调UI引发的事件并调用服务方法的C#类)
如果控制器要求服务执行某些操作,但该服务首先需要从控制器获得更多的操作(即控制器必须使用UI从用户处获取的数据),该服务应如何让控制器执行此操作?


我对这个概念很满意

  • 用户与
  • 与进行通信的用户界面
  • 与之通信的控制器
  • 与进行通信的服务组件(不要与web服务或进程外服务混淆)
  • 通信的数据/存储库
等等

但是,对于与服务通信的控制器,什么方法最适合?应:

  • 服务方法应该是相当细粒度的,如果有不正确的地方就会抛出异常,这样控制器就知道是继续前进还是告诉用户出了什么问题?或者
  • 服务方法返回控制器可以检查以决定下一步操作的对象
  • 我喜欢第一个选项,因为第二个选项可能意味着类爆炸,在这种情况下,每个服务方法都需要一个
    servicesult
    样式的类

    我这样问是因为服务组件当然不能告诉UI做什么,只有控制器可以,但是控制器不知道在没有得到服务反馈的情况下告诉UI什么


    您认为呢?

    在设计服务层/类时,您需要记住的第一件事是使它们高度可重用。它们应该是原子服务对象,不仅可以服务于您的控制器,还可以服务于将来的任何其他客户端

    这里有几个问题:

  • 控制器如何找到服务?
    如果您希望拥有高度可重用、可扩展和。。。对于服务对象,控制器和服务类之间的依赖关系应该是松散耦合的。避免任何紧耦合技术。相反,尝试将服务类添加到控制器(使用IOC容器),并且您也可以使用

  • 如何与服务沟通?
    嗯,这取决于应用程序的大小。您可以选择企业服务技术,如Web服务,只需使用应用程序服务即可。在此基础上,定义控制器和服务之间的协议

  • 服务应将哪些数据返回控制器?
    请记住,服务层不应该知道任何有关UI导航的信息。控制器有责任根据服务对象的响应来决定去哪里以及做什么。为什么?假设这个服务类需要用于另一个UI(比如从web到flex、silverlight或桌面应用程序)。如果您在服务类中添加导航逻辑(作为一个极端的例子,UI逻辑/格式),它将无法为另一个UI系统重用,也无法为同一应用程序中的其他服务类和控制器重用

  • 总之,尽量保持服务类中没有任何导航逻辑。控制器就是为了这个目的而设计的。

    参见我的问题

    为了更好地回答您的问题,这里缺少一些细节:

    这是一个网络场景还是桌面场景

    如果是桌面-这是一个断开连接的场景吗?(例如,具有远程服务的富客户端)或客户端和服务是否在同一台计算机上

    如果是web—它是经典的web 1.0应用程序吗?(视图创建为页面)还是富客户端?(AJAX、Flex、SilverLight)控制器有时可以在客户端的什么位置?(弹性)

    所有这些都会对决策产生重大影响


    顺便问一下,您是否有意省略了模型?

    您最好的选择可能是使用事件或委托模型-例如,控制器订阅“需要更多信息”事件并显示适当的表单。将附加数据返回到服务可以通过几种不同的方式完成,但在很大程度上取决于您的设计细节(例如,您的服务是否无状态等)

    您是否为您的服务编写了单元测试?如果没有,这个过程可能会帮助您澄清您希望从设计中得到什么。

    我经常使用MVC(尽管我的是Java web app风格),并且我经常遇到一些情况,似乎服务需要以某种方式与控制器进一步交互。但在每种情况下,结果都表明我在控制器中做了一些错误的事情,或者我的服务接口不够灵活(即细粒度)

    当服务没有收到足够的数据时,这是因为用户提供了无效的输入吗?如果是这样,那么控制器应该对输入执行验证,并显示相应的提示或错误消息

    如果预期用户不会一次提供所有数据,那么控制器应该知道服务不会按原样接受数据。因此,控制器应该通过UI管理与用户的对话,然后最终将所有内容传递给服务

    或者,控制器可能需要在整个向导流程中查询服务。在这种情况下,服务的接口可能应该更细粒度

    我同意你提出的选项1。如果控制器能够从UI收集所有必需的输入,并将它们提供给服务,但它没有做到这一点,那么服务应该抛出异常。使用异常是明智的,因为您试图将无效数据传递给服务。(这并没有改变一个事实,即例外情况不应该是b