我发现自己需要让View公开它的Model和Controller引用。这是设计糟糕的气味吗?或者这被认为是“安全”的做法?
例如:我有一个列表(由ListView
,ListController
和ListModel
组成)和许多列表项(由ItemView
组成,{{1 }和ItemController
)。
当我为每个列表项创建ItemModel
,ItemModel
和ItemView
时,我将ItemController
实例传递给ItemView
。但是,稍后,我的ListView
需要引用相应的ListController
实例。
那么,将ItemController
和 ItemView
传递给ItemController
或者传入ListView::addItem()
是否更合适?并公开实例方法,例如ItemView
?
或者不重要吗?每种方法都同样可行吗?如果按照他们的逻辑结论,这两种策略是否会产生反模式?
答案 0 :(得分:1)
在mvc模式中,用户请求应路由到具有操作的控制器,例如invoicecontroller。 假设默认操作Index返回发票列表;然后,控制器创建一个包含发票对象列表的模型,实例化正确的视图并将模型注入视图。 现在正是观点转向做它的魔力。它使用它拥有的数据呈现最佳视图,其中可能包括到一个或多个控制器的路由。 在NO实例中,视图(或模型)应该自己执行业务逻辑。 那就是说,我完全赞同雅库布。希望有所帮助。
答案 1 :(得分:1)
但是,稍后,我的ListController需要对相应的ItemController实例的引用
为什么呢?如果你正确地解耦你的课程,你不应该需要这个。
控制器几乎总是处理功能域。此类域的示例可能是“Sales”或“Admin”。此外,MVC还支持使用“区域”,它提供了额外的组织层次结构。
从其他控制器添加对控制器的引用与此组织结构存在交叉目的。如果您需要组合功能以使代码更干,那么普通的重构将实现这一点。您还可以从包含常用功能的基类继承控制器。
答案 2 :(得分:0)
考虑到你实际上并没有显示任何代码。 在我看来,你应该改变你的设计。控制器不应该与另一个控制器(直接)通信,MVC指示它:reference。
如果需要从另一个控制器调用控制器操作,请考虑使用委托或组合。而不是直接调用控制器动作。