我正在扩展/将旧版Web表单应用程序扩展为完全新的MVC应用程序。扩展在技术方面以及商业用例。遗留应用程序是一个干得好的数据库驱动设计(DBDD)。所以对于例如,如果您有不同类型的员工,如操作员,主管,商店守门员等,并且需要添加新类型,您只需添加一些行,在几张表和Voila中添加一些行,您的UI会自动添加/更新新的一切员工的类型。 然而,层的分离并不是那么好。

新项目有两个主要目标

  • 可扩展性(用于目前和未来的管道要求)
  • 性能

    我打算使用域驱动设计(DDD)更换数据库驱动设计(DBDD)的新项目,以保持可扩展性要求。然而,如果我将其与遗留DBDD应用程序的性能进行比较,则从数据库驱动设计转向域驱动设计似乎对性能要求反映影响。在遗留应用程序中,来自UI的任何对数据的呼叫都将直接与数据库交互,并且任何数据都将以DataReader的形式返回,或(在某些情况下)数据集。

    现在使用严格的DDD,任何用于数据的呼叫都将通过业务层和数据访问层路由。这将意味着每个呼叫都会初始化业务对象和数据访问对象。单个UI页面可能需要不同类型的数据,并且可以由多个用户请求每个页面的Web应用程序。此外,MVC Web应用程序是无状态的,每个请求都需要每次和每次初始化业务对象和数据访问对象。 因此,似乎是一个MVC无状态应用程序,DBDD优先于DDD进行性能。

    或者在DDD中有一种方式实现两者,DDD提供的可扩展性和DBDD提供的性能?

有帮助吗?

解决方案

您是否考虑了某种形式的命令查询分离,其中更新通过域模型,但读数是DataReader?完整的DDD并不总是合适的。

其他提示

“现在使用严格的DDD,任何用于数据的呼叫都将通过业务层和数据访问层路由。”

我不相信这是真的,这肯定不实用。我相信这应该是:

现在使用严格的DDD到位,任何对事务的呼叫将通过业务层和数据访问层路由。

没有什么可以直接调用数据访问层,以便获取屏幕上所需的任何数据。只有当您需要修改您需要调用基于其行为时所设计的域模型的数据时。在我看来,这是一个关键的区别。如果您通过域模型路由所有内容,则会有三个问题:

  1. 时间 - 它将需要更长时间来实现功能,无益。
  2. 模型设计 - 您的域模型将弯曲异形,以满足查询的需求而不是行为。
  3. 性能 - 不是因为额外的图层,而是因为你不会能够直接从查询中快速获取模型中的聚合数据。即,考虑为特定客户提供所有订单的总价值 - 为此编写查询的速度要快得多,而不是获取客户的所有订单实体,迭代和总和。

    作为Chriseyre2000提到,CQRS旨在解决这些确切的问题。

使用DDD在您的场景中不应具有显着的性能。你担心的似乎更像是一个数据访问问题。您将其称为

初始化业务对象和数据访问对象

为什么'初始化'昂贵?您使用的是数据访问机制是什么?

DDD通常使用ORM实现存储在关系数据库中的长LENVEVED对象。如果使用适当的,ORM将很少,如果有的话,对大多数应用程序的性能影响。如果有经过验证的瓶颈,您可以始终将应用最敏感的部分切换到原始SQL。

对于它的价值,只有在应用程序启动时只需要在应用程序启动时初始化一次,之后它使用与常规数据读取器相同的ADO.NET连接池。因此,它全部归结为适当的映射,获取策略,避免经典的数据访问错误,如“n + 1选择”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top