2012-02-13 57 views
5

MVC/MVP中松散耦合的控制器间通信的好方法是什么?MVC/MVP中的控制器间通信

例如,在报价中,用户必须创建并添加新联系人或添加现有联系人。

他们选择创建一个新的联系人。完成后,该联系人将添加到报价中,并且用户界面将该用户返回给该报价。如果他们击中取消,他们将返回到报价。

我想在其他地方重新使用联系人,因此它不应该知道任何关于报价。例如,如果我从联系人列表中创建联系人,则应在完成后返回。

这里是我想到的一些选项:

  • ContactsController行动呼吁ApplicationController.getNextStep(本)和ApplicationController的数字出来,下一步代表ContactsController

  • ContactsController的引发“actioncomplete”事件或类似事件,并且ApplicationController正在侦听此事件,并调用正确的下一步

  • QuoteController通过“接力棒”传递给ContactsController,下一步,ContactsController完成时调用

  • ContactsController引发“actioncomplete”事件或类似事件,并且QuotesController正在侦听此事件并调用正确的下一步。

您是否有这些经验?其他想法?哪一个会导致大型应用程序中最少的头痛?

谢谢!

回答

1

猜猜我会回答我自己的问题。希望我得到那甜美可爱的赏金。

从将顾问员工发送给客户的角度思考此问题。他知道如何完成他的工作,但他完成时不知道该怎么做。你希望他对下一步的工作保持灵活性。

有时他的老板把他送出去。有时候CEO会这么做(他可能不知道在哪里发送给他)。有时候客户会在紧急情况下打电话给他(他肯定不知道在哪里送他)。有时他只是从白板上抓起一项新任务。

他可以做的几件事情之一:

  • 你可以告诉他打电话给总部时,他做了,并且总行将弄清楚他。他不需要知道任何其他人,只需要了解总部的电话号码。

  • 你可以告诉他在他离开之前他完成了什么工作。如果他走了一段时间,他的下一个任务可能在此期间发生了变化。

  • 你可以告诉他,当他完成后张贴到Facebook,总公司会寻找它,并会告诉他该怎么做。总部将需要关注所有顾问的大量Facebook职位。

  • 你可以告诉他的主管在他完成时回答他的电话,但是他的主管需要在办公室,也许他会改变主管。

就我个人而言,我会传入一个回调函数。如果该回调为空,则被调用者应该询问应用程序要做什么。这给了你一些灵活性,同时也允许父进程管理事情,而不是依靠应用程序中的一个大功能。

这相当于在顾客完成时向顾问提供下一位顾客的电话号码。如果他没有得到号码,他就打电话给总部。

你也可以使用一个事件,这不是一个坏主意。唯一的问题可能是如果多个对象正在监听这个事件,可能会发生一些不合时宜的事情。

1

您可以实现某种形式的导航堆栈,其中报价或联系人控制器首先被推入其中,然后在需要时将联系人控制器推入其中。当联系人控制器完成后,它会自动关闭,并在下一个关闭控制器处知道去哪里。这样它就完全分离了,并且可以在任何地方重复使用,并且可以嵌套在n层深处。

1

如果我正确理解你的问题,你有一个整齐地被控制器封装的动作,并且你想确保它的执行后行为可以被动态地定义。

您对回调函数的想法非常好,但我会更进一步,使其成为Func <>,允许您利用闭包。我会扩展你的顾问比喻:不要将电话号码传递给你的代表,而是让他连接到办公室,并从那里获得指示。使用闭包的优点在于,您可以直接从代码以外的代码访问调用上下文;换句话说,闭包可以访问主机控制器中变量和函数的全部全部。

当你的业务员与他的任务完成后,他只打开他的公文包(Func键<>),并将手伸进办公室台,看是否有人已经把一个任务物品在他的办公室抽屉里。

Jon Skeet(也在StackOverflow上)在这里有一个很好的资源:http://csharpindepth.com/articles/chapter5/closures.aspx