MVC / MVP中松散耦合的控制器间通信有什么好方法?
例如,在Quote中,用户必须创建并添加新联系人,或添加现有联系人。
他们选择创建新联系人。完成后,联系人将添加到报价中,并且UI会将用户返回到该报价。如果他们点击取消,他们将返回报价。
我想在其他地方重新使用联系人,因此它不应该对Quote有任何了解。例如,如果我从联系人列表创建联系人,则应在完成后返回该联系人。
以下是我想到的一些选项:
ContactsController动作调用ApplicationController.getNextStep(this),ApplicationController代表ContactsController将其计算出下一步
ContactsController引发“actioncomplete”事件或类似事件,ApplicationController正在侦听此事件,并调用正确的下一步
QuoteController通过下一步将“baton”传递给ContactsController,ContactsController在完成后调用
ContactsController引发“actioncomplete”事件或类似事件,QuotesController正在侦听此事件,并调用正确的下一步。
你有这些经验吗?其他想法?这将导致一个大应用程序中最少的头痛?
谢谢!
答案 0 :(得分:1)
猜猜我会回答我自己的问题。希望我得到那甜蜜,甜蜜的恩惠。
从将顾问员工派遣给客户的角度来考虑这一点。他知道如何完成自己的工作,但他不知道自己完成后该怎么做。你希望他对下一步的工作保持灵活性。
有时老板会把他送出去。有时CEO会这样做(他可能不知道在哪里送他)。有时客户会在紧急情况下给他打电话(他肯定不知道在哪里送他)。有时他只是从白板上抓取一个新任务。
他可以做以下几件事之一:
你可以告诉他在他完成后给总公司打电话,总公司会为他解决这个问题。他不需要了解任何其他人,只需知道总公司的电话号码。
在他离开之前,你可以告诉他在他结束时该怎么做。如果他已经离开了一段时间,他的下一个任务可能会在此期间发生变化。
你可以告诉他在完成后发布到Facebook,总公司会寻找它,并会告诉他该怎么做。总公司需要关注所有顾问的很多Facebook帖子。
你可以告诉他的主管在他结束时接听电话,但是他的主管需要在办公室,也许他会转换主管。
就个人而言,我会传递一个回调函数。如果该回调为null,则被调用者应该询问应用程序该做什么。这为您提供了一些灵活性,同时还允许父进程管理事物,而不依赖于应用程序中的一个大功能。
这相当于在顾问完成后向顾问提供下一位客户的电话号码。如果他没有得到号码,他会打电话给总部。
你也可以使用一个事件,这不是一个坏主意。唯一的问题可能是如果多个对象正在监听此事件,可能会发生一些不幸的事情。
答案 1 :(得分:1)
您可以实现某种形式的导航堆栈,首先将Quote或Contacts控制器推入其中,然后在需要时将Contact控制器推入其中。完成Contact控制器后,它会自动弹出并在下一个控制器达到峰值,以便知道要去哪里。这种方式完全解耦,可以在任何地方重复使用,并且可以嵌套在n级深层。
答案 2 :(得分:1)
如果我正确理解了您的问题,您可以通过控制器整齐地封装一个动作,并且您希望确保其后执行行为尽可能动态地定义。
您对回调函数的想法非常好,但我更进一步,使其成为 Func<> ,允许您使用闭包。我将扩展您的顾问比喻:而不是将电话号码传递给您的代表,而是将他连接回办公室并从那里获取指示。使用闭包的好处是你可以直接从代码访问调用上下文,否则超出范围;换句话说,闭包可以访问主机控制器中的所有变量和函数。
当你的推销员完成他的任务时,他只是打开他的公文包(Func<>)并进入办公室的办公桌以查看是否有人放入了待办事项他的办公室抽屉。
Jon Skeet(也在StackOverflow上)有一个很好的资源:http://csharpindepth.com/articles/chapter5/closures.aspx