ASP.NET MVC - 具有内置逻辑与业务服务的实体

时间:2009-10-14 13:57:39

标签: asp.net-mvc design-patterns

我当前的架构基于我的实体,它们是数据的简单容器,其中很少或没有逻辑。任何业务决策都是由Service类做出的,它们将实体作为参数然后返回数据。但是,我发现随着系统规模的扩大,这种方法变得有点笨拙。

例如,我们有一个ASP.NET MVC Web应用程序,它显示了一个产品列表 - 其中一些产品可供当前用户订购,有些可能不是。在我们的控制器类中,我们获取要显示的产品,然后当每个产品显示在页面上时,我们必须调用我们的一个服务类,并确定该产品是否可供该客户订购。

<% For Each p In Model.Products %>
  <%= Html.Encode(p.Title) %>

  <% If AuthService.CanProductBeOrderedByUser(p, Model.CurrentUser) Then %>
    <a href="#">Click here to order</a>
  <% End If %>

<% Next %>

问题在于,这需要在页面中构建逻辑,并且还需要在每次迭代时调用服务。如果我在多个地方也需要这些信息,则需要大量重复。

是否有人对上述内容或任何有关如何改进的指导意见?

由于

詹姆斯

4 个答案:

答案 0 :(得分:2)

示例可以是 ViewModel - 层次结构,其中产品的VM将具有Property IsOrderable

此属性如何变为true或false与视图无关。

答案 1 :(得分:2)

当您进行跨实体操作(涉及不同类型的实体)时,业务服务很少。如果您的业务操作仅与一个实体严格相关,那么将此操作放入实体类中会更好。

答案 2 :(得分:2)

让您的控制器在“产品”列表中执行客户相关过滤,让视图显示它们。 这可以通过多种方式实现:产品的扩展功能,ProductService或数据存储库参数化查询。

答案 3 :(得分:0)

我不能建议将CSLA用于智能实体。我和你一样,以前只使用数据对象来保存我的数据,但是自从交换到CSLA后,事情变得越来越好。

这是一个非常复杂的免费框架,拥有庞大的用户群。

它支持:

  • 集中业务逻辑
  • 交易
  • 最多字段级安全性
  • 最多到字段级验证
  • 自动IsDirty功能
  • 了解只读/可编辑/子/父数据对象和关系
  • 多台服务器

在这里查看:

Official Web Site

和“入门”一书在这里:

eBook