MVC范例:从视图中公开模型和控制器

时间:2012-03-05 19:20:53

标签: model-view-controller design-patterns

我发现自己需要让View公开它的Model和Controller引用。这是设计糟糕的气味吗?或者这被认为是“安全”的做法?

例如:我有一个列表(由ListViewListControllerListModel组成)和许多列表项(由ItemView组成,{{1 }和ItemController)。

当我为每个列表项创建ItemModelItemModelItemView时,我将ItemController实例传递给ItemView。但是,稍后,我的ListView需要引用相应的ListController实例。

那么,将ItemController ItemView传递给ItemController或者传入ListView::addItem()是否更合适?并公开实例方法,例如ItemView

或者不重要吗?每种方法都同样可行吗?如果按照他们的逻辑结论,这两种策略是否会产生反模式?

3 个答案:

答案 0 :(得分:1)

在mvc模式中,用户请求应路由到具有操作的控制器,例如invoicecontroller。 假设默认操作Index返回发票列表;然后,控制器创建一个包含发票对象列表的模型,实例化正确的视图并将模型注入视图。 现在正是观点转向做它的魔力。它使用它拥有的数据呈现最佳视图,其中可能包括到一个或多个控制器的路由。 在NO实例中,视图(或模型)应该自己执行业务逻辑。 那就是说,我完全赞同雅库布。希望有所帮助。

答案 1 :(得分:1)

  

但是,稍后,我的ListController需要对相应的ItemController实例的引用

为什么呢?如果你正确地解耦你的课程,你不应该需要这个。

控制器几乎总是处理功能域。此类域的示例可能是“Sales”或“Admin”。此外,MVC还支持使用“区域”,它提供了额外的组织层次结构。

从其他控制器添加对控制器的引用与此组织结构存在交叉目的。如果您需要组合功能以使代码更干,那么普通的重构将实现这一点。您还可以从包含常用功能的基类继承控制器

答案 2 :(得分:0)

考虑到你实际上并没有显示任何代码。 在我看来,你应该改变你的设计。控制器不应该与另一个控制器(直接)通信,MVC指示它:reference

如果需要从另一个控制器调用控制器操作,请考虑使用委托或组合。而不是直接调用控制器动作。