2012-03-05 72 views
0

我发现自己需要让View公开它的模型和控制器引用。这是不好的设计的气味?或者这被认为是“安全”的做法?MVC范例:从视图中揭示模型和控制器

例如:我有一个列表(的ListViewListControllerListModel组成)和许多列表项(的ItemViewItemControllerItemModel组成)。

当我创建ItemModelItemView,并且ItemController列表的每个项目,我通过ItemView实例关闭的ListView。但是,稍后,我的ListController需要参考相应的ItemController实例。

所以,这将是更恰当的同时通过ItemViewListView::addItem()ItemController,或只是通过在ItemView和暴露为ItemView::getController()实例方法等?

还是没关系?每种方法均可行吗?如果遵循他们的逻辑结论,两种策略都会导致反模式吗?

+0

'但是,在稍后的时间点,我的ListController需要对相应的ItemController实例的引用 - 为什么?如果你正确地解耦你的类,你不应该需要这个。 – 2012-03-05 19:24:06

+0

'当我创建ItemModel,ItemView和ItemController'时,您为列表中的每个项目创建一个控制器? - 这对我来说是一种气味。 – 2012-03-05 19:33:53

+0

你在说网络或桌面应用程序吗?它们是有区别的。 – 2012-03-05 19:48:43

回答

1

但是,在以后的某个点上,我ListController需要相应的ItemController实例

为什么一个参考?如果你正确地解耦你的类,你不应该需要这个。

控制器几乎总是处理一个功能域。这样一个域的例子可能是“销售”或“管理员”。另外,MVC还支持使用“区域”,它提供了额外的组织等级。

添加对来自其他控制器的控制器的引用与此组织结构是交叉目的。如果你需要结合功能来让你的代码更干,普通的重构就可以实现这一点。您也可以从包含通用功能的基类中继承控制器

+0

伟大的洞察力 - 谢谢! – 2012-03-07 17:15:40

0

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

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

1

在mvc模式中,用户请求应该被路由到一个控制器,比如说invoicecontroller,它有动作。 可以说,默认操作Index返回发票清单;然后控制器创建一个包含发票对象列表的模型,实例化正确的视图并将模型注入到视图中。 现在,它的意见转而做它的魔力。它使用它所具有的数据呈现最佳视图,其中可能包括路由到一个或多个控制器。 在任何情况下,视图(或模型)都应该自己执行业务逻辑。这就是说,我完全同意Jakub。希望有所帮助。

相关问题