【问题标题】:Keeping no business logic in the UI layer of an Asp.net MVC 4 project在 Asp.net MVC 4 项目的 UI 层中不保留业务逻辑
【发布时间】:2013-05-24 16:30:03
【问题描述】:

我有一个 MVC 4 项目,其中 UI 被强类型化为 ViewModel。视图具有某些需要在某些场景中显示的元素。这些场景是由业务逻辑控制的,所以我不想在 UI 中出现这样的条件语句

If (Role.Equals(“Admin”))
{
  <a href=””> Admin Link here</a>
}

我所拥有的是业务层为我创建了一个视图模型。所以上面的语句现在在如下的业务层中

If (Role.Equals(“Admin”))
{
 ViewModelClassObject.ShowAdminLinks = true;
}

在我的 UI .aspx 层如下

If (model.ShowAdminLinks)
{
  <a href=””> Admin Link here</a>
}

现在的问题是,我将视图模型类放在一个单独的类库中,业务和 Web UI 层都引用了该类库。由于 viewmodel 类还具有映射到 UI 层的文本框的属性,我在其中执行一些验证,如必填字段验证器、比较、范围验证器,我现在需要在我的 ViewModel 类中引用 System.web.mvc 层图书馆。这是不好的编码习惯吗?尽管代码可以编译和构建,但我感觉我可能正在做一些可能是代码异味的事情。或者,我也在考虑将 ViewModel 类移回 Web UI 层,并在 Web 项目中使用某种视图模型构建器,通过调用业务层方法来创建视图模型。这样就不需要有一个单独的 ViewModel 类库来引用 System.Web.MVC dll,我的控制器可以调用这个视图模型构建器类来构建视图模型

您对此有何看法?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 razor web-standards


    【解决方案1】:

    我会将 Web 项目使用的 ViewModel 和业务层使用的 DTO 分开。

    原因可能是您不需要属性ShowAdminLinks 或业务层中的某些下拉值。所以业务层只知道它需要知道的数据。

    这样您就可以获得干净的多层应用程序。当然,这意味着您必须通过创建和设置 DTO 值进行更多编码。有些人为此使用automapper,但我不想这样做。为什么?手动操作并不难,而且效果更好 - 没有魔法。

    【讨论】:

    • 谢谢马克斯。现在,我正在考虑将视图模型保留在 Web UI 层中,并将构建视图的业务逻辑也保留在同一 Web UI 层中。这里的问题是,现在我的部分业务逻辑正在泄漏到视图中,不是吗?.. 虽然它只是与视图有关的部分,如果我想测试负责创建视图的逻辑,我现在可以做到了,而不必担心在我的测试项目中调用控制器操作方法..
    • 我不会称之为业务逻辑泄漏。如我所见,控制器用于从客户端检索数据(也对其进行验证)并构建视图模型。当涉及从请求以外的其他资源获取数据或执行任何其他操作时,应该将其移至另一层 - 数据、服务或其他。
    • 您的 ViewModel 可以从您的业务 DTO 继承,并且只需添加 View 特定字段(例如:ShowAdminLinks)。然后你会有更多的分离,同时减少字段映射负担。
    • @AndrewLewis 是的,有时这也很有用。另外我练习的是隐式运算符。
    • 谢谢安德鲁。我创建了与数据库表一对一映射的 DTO 类。有时我需要在我的 Viewmodel 中使用 List 来显示一个充满该表记录的网格。所以我不确定继承在这里是否对我有用。但是,您确实提出了一个有趣的观点,我也许可以在其他地方使用。但是,这再次意味着我有一些从 DTO 继承的视图模型和一些包含它们作为属性的视图模型。我认为这又不是很干净......
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2017-01-10
    • 2011-12-03
    • 2013-03-23
    • 2011-09-03
    • 2010-10-21
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多