MVC - 是否应该允许视图直接与服务交互而不通过控制器

发布于 2024-12-10 07:35:11 字数 1070 浏览 0 评论 0原文

我的架构如下所示:

View - Controller - Services

将视图之一视为人员详细信息页面。控制器调用

(Person) service.getPerson(1234)

Person 实例并将其返回到视图中进行显示。该服务获取 Person 的方式是通过 RESTFul Web 服务进行交互。

Restful 服务会返回以下响应:

<person>
  <id>1234</id>
  <name>John Doe</name>
  <person-detail-uri>/person/1234/detail</person-detail-uri>
</person>

上面的响应被映射到一个名为 Person 的类,看起来像这样:

class Person{
    Long id;
    String name;
    String age;
    String address
}

通过获取 person

/person/1234

,然后通过获取详细信息,

/person/1234/detail

可以创建一个完整的 person 对象假设视图需要显示 person细节。

问题:

选项 A:控制器是否应该在服务上调用 getPerson() 和 getPersonDetails() 来创建完整的 Person 实例

,或者

选项 B:只需 getPerson() 并让视图调用 person.getAge() ,这会以某种方式(可能通过方面) ) 触发详细信息获取。

我在选项 A 中失去了一些灵活性,但是,它使模型非常愚蠢,我认为这是一件好事,因为视图中的错误代码不会污染缓存,因此可能不会引起性能问题。

My architecture looks like this:

View - Controller - Services

Think of one of the views as a Person details page. The controller calls

(Person) service.getPerson(1234)

and returns the Person instance to the view to display. The way the service fetches the Person is by interacting through a RESTFul webservice.

The restful service responds back with following response:

<person>
  <id>1234</id>
  <name>John Doe</name>
  <person-detail-uri>/person/1234/detail</person-detail-uri>
</person>

The above response is mapped to a class called Person that looks something like this:

class Person{
    Long id;
    String name;
    String age;
    String address
}

A complete person object can be created by getting the person through

/person/1234

and then the details through

/person/1234/detail

Assume that the view needs to display person details.

Question:

Option A: Should the Controller call getPerson() and getPersonDetails() on the service to create a complete Person instance

or

Option B: Just getPerson() and let the view call person.getAge() that will somehow(probably through aspects) trigger a details fetch.

I lose some flexibility in Option A, however, it makes the model very dumb which I consider a good thing because then a bad code in view cannot pollute caches and hence may not cause performance concerns.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不寐倦长更 2024-12-17 07:35:11

没有“应该”,这只是取决于。在我看来,允许视图层进行延迟初始化是有风险的,因为很容易无意中触发大量查询。

此外,它使视图层相当智能,因为它现在控制数据初始化,而不是隔离控制器或模型中的数据获取。我喜欢愚蠢的观点,但这可能是偏见,而不是基于纯粹的技术论证。

There's no "should", it just depends. IMO it's risky to allow the view layer to do lazy initialization because it's easy to accidentally fire off lots of queries without meaning to.

In addition, it makes the view layer fairly intelligent in that it now controls data initialization rather than isolating data fetch in the controller or model. I like dumb views, but that may be bias, rather than something based on a purely technical argument.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文