【发布时间】:2016-12-26 18:48:54
【问题描述】:
我似乎找不到可以接受的答案。
我一直看到两件大事: 1)不要在控制器中执行查询。那是业务或数据的责任。 2) 只选择查询中需要的列。
我的问题是这两个东西有点像,因为 UI 中显示的内容实际上决定了需要查询哪些列。这反过来导致在控制器中运行查询的明显解决方案,这是您不应该做的。我在谷歌上搜索到的任何文档等似乎都很方便地忽略了这个主题并假装它不是问题。
在业务层做
现在,如果我采取另一种方式并查询业务层中的所有内容,那么我隐含地使所有数据访问都紧密地反映了 ui 层。查询函数和类的命名问题比我想象的要严重。
以一个应用程序为例,该应用程序具有多个视图,用于显示有关客户的不同信息。很自然的做法是将这些数据传输类命名为与需要它们的视图相同的名称。但是,业务或服务层不了解 ui 层,因此这些数据传输类中的任何一个都可以真正用于任何视图,而不会破坏任何架构规则。那么,我该如何命名所有这些变体,比如“客户”,其中一个选择名字和姓氏,另一个可能选择姓氏和电子邮件,或者名字和城市,等等。您只能将这么多类命名为“CustomerSummary”。
Entity Framework 和 IQueryable 很棒。但是,其他的呢?
我知道在实体框架中,我可以让数据层传回一个 IQueryable,其执行被推迟,然后告诉 IQueryable 我想要什么字段。这太棒了。它似乎解决了这个问题。对于.NET。问题是,我也是做PHP开发的。几乎所有 php 的 ORM 的设计方式都完全违背了使用 ORM 的目的。甚至那些不具备与 EF / IQueryable 相同的能力。所以我又回到了同样的问题,没有在 PHP 中再次解决。
总结
所以,我的总体问题是,如何在不完全违反 ntier 架构的所有规则的情况下只获得我需要的字段?并且没有创建不可避免地必须设计为反映 UI 层布局的数据层?
【问题讨论】:
-
忽略第二条“规则”,除非您遇到真正的性能问题并且已经用尽了其他(更简单、更有效)的优化,例如缓存。
标签: php asp.net-mvc model-view-controller architecture n-tier-architecture