2009-07-31 69 views
3

如果有分层这样的商业应用的一条线,这会是劳动力的适当分工:如何拆分数据层和业务对象层,每个层的适当职责是什么?

数据访问

  • 调用只有存储过程,映射的DTO的属性到用于填充ADO.NET命令的参数集合的散列表tablse。

  • 仅参考SqlDataClient的程序集。

  • 重要的逻辑处理什么意味着空白,null和空的映射代码,但其他方面没有验证或其他领域特定的逻辑。

所谓业务逻辑

  • 拆分多个结果集成单独的数据表,例如

    公共无效ReturnNthRecordSetFromStoredProcFoo()

  • 穿过用于数据集的数据访问,例如

    公共无效ReturnDataSet(字符串名称){ 回报(新PersonController).GetAnotherDataSet(名);}

  • 一个DataTable的一列映射到一个DTO小号

  • 重大逻辑处理什么样的手段空白,空,并在映射代码中为空。
  • 保留事务对象,尽管它专门用于包装单个存储过程调用。
  • 不必SqlDataClient的引用,所以它不能使用SqlDataReaders填写的DTO
  • 没有提到的System.Web.UI
  • 授权规则,但在其他方面没有域特定的逻辑。

UI

  • 2路数据到ASP.NET形式的DTO的结合。
  • 验证控件属性 - 通常不直接对DTO进行验证
  • 通过将DataSets绑定到网格来导航“集合”。事实上试图与藏品做任何需要的UI遍历数据行的数据表,了解相应的列名是什么(这是一般只有一种 - 的 - 类似的DTO)

这样的问题,最后 - 在此应用程序中,数据访问层是否应将所谓业务层的职责合并?这不是已经是一个两层,(差不多一个!)应用程序,除了一个额外的程序集的不便之处?

附加信息:好吧,我已经知道应用程序服务器将是一台机器,可能永远都是,因为它是一个低用户数的Intranet应用程序。所以我不知道要设计物理上独立的应用程序层。另外,它可能只支持一个UI,并且如果它需要支持除ASP.NET以外的其他功能,则会被完全废弃 - 另一个经常被引用的层/层的原因。

+0

请参阅我的回应: http://stackoverflow.com/questions/549305/how-to-handle-communication-between-the-domain-and-database-layers/1209765#1209765 别如果你喜欢我的想法,不要忘记注册。 – 2009-07-31 11:46:17

回答

3

听起来,层之间的责任有点混乱。数据层听起来相当标准。 (“所谓的”)业务层是事物混乱的地方。

在业务层的一些想法:

  • 似乎有大量的数据表示。你提到数据表,数据集,数据传输对象。整个应用程序的标准方法会更好。

  • 具有像ReturnNthRecordSetFromStoredProcFoo和ReturnDataSet这样的名称的业务层方法没有意义,也没有为业务服务提供适当的抽象级别。 (也许这些只是应用程序中选择不好的示例?)

  • 通常,业务层提供的不止是DataSet传递。业务层应该关注验证,业务规则,安全性甚至审计(尽管有些人喜欢在数据库中这样做),而不是处理映射,空值等。

  • 尽管业务层只调用单个存储过程,但我对业务层中的事务控制没有任何问题。业务层应该控制事务,以便多个数据对象都可以参与同一个事务(甚至可以跨越不同的数据库)。即使现在只有一个调用,如果您将来需要添加更多调用,这将很容易,并且不会导致将事务控制改进为您的应用程序。

  • 我认为依赖关系正常 - 没有引用业务层中的Web.UI或SQLClient。

  • 授权规则也可以。我会扩大到包括安全而不仅仅是授权。另外,我没有看到任何商业逻辑 - 只是好奇商业逻辑是否在存储过程中?如果我要猜测,我会说是的,因为每个业务方法只调用一个存储过程。如果是这样,那么对我来说这是一个很大的不行。


我不会结合业务和数据层。我更愿意将业务逻辑层和数据访问层分开。考虑到将它们结合起来并试图将责任分开一点,我会倾向于后者。

但是,看到这是一个现有的应用程序的问题,我会采取更务实的观点。一切都伴随着成本,重要的是要确定正在做什么变化,变化的努力和风险是什么,变化的好处是什么,以及这些变化将如何影响测试周期。

需要思考的其他问题包括:您想要解决的主要问题是什么?它们是否有效(例如缺陷,缺乏稳定性)?或性能相关?还是建筑?或者可能与可维护性有关 - 您是否需要添加新功能但难以发现?你有时间表还是预算?如果你可以回答一些这些问题,它可能有助于指导你。

1

我期望看到你所描述的业务层作为数据层类型的东西。我希望我的数据层能够保护我免于担心空值和这样的事情。我也希望我的业务层包含更抽象的业务规则和概念。例如,如果“组”是“用户”的集合,我希望看到业务类型功能可以将这些用户作为高级别组的一部分来操纵这些用户。例如,可能会为该组的所有成员分配权限,或者允许UI级别将这些策略应用到作为组成员的用户。我不希望看到那些试图隐藏所有来自数据库的事实的函数。我希望这是有帮助的。

3

根据您的服务器负载应该确定物理层的数量。逻辑层的数量实际上更多是个人选择。

在我们的组织中,我们使用CSLA framework。它是一个业务对象框架,致力于使数据绑定的UI易于使用和维护,同时提供数据层的灵活性。

我不会深入这里深入,因为它会更好地为您自己确定该框架是否值得您使用,但不用说,它有它自己的SafeDataReader类,它占到了空值,无需使用数据集。

它的“dataportal”(文章较旧,但仍然相关)允许您轻松地将数据访问移动到其自己的层,并且不需要更改代码。

DNRtv有一些视频pod演员,CSLA的设计者Rockford Lhotka展示了示例应用程序的工作原理。 Part 1Part 2

节目每个只有一个小时,可能可以帮助您决定它是否适合您使用。

+1

物理层也可以根据安全需求来确定。例如DMZ中的Web服务器(带有业务层)可能无法访问数据库。此外,如果您的应用程序设计正确,则可以将整个应用程序部署在单个物理服务器上(现在将数据库留出),如果负载太高,则可以使用另一个负载平衡服务器进行扩展(但仍然是一个物理层)。 – 2009-07-31 12:58:33