gpt4 book ai didi

.net - 数据库结构略有不同的多客户项目的架构设计(针对每个客户)

转载 作者:行者123 更新时间:2023-12-01 11:06:27 25 4
gpt4 key购买 nike

我正在维护一个为每个新客户复制粘贴的应用程序(...是的,我知道)。如果一个新客户想要一些其他人不需要的新功能,只改变他的代码部分。该解决方案还包括一种“common.dll”,其中放置了对所有客户都相同的所有代码。

每个客户的基础 MSSQL 数据库略有不同。所有这些都或多或少地具有相同的表格,但一些客户具有例如用于自定义特定功能的附加列或新表格。

由于在 Visual Studio 解决方案中为每个客户使用“类型化数据集”(ADO.NET C# 2.0),所以总是有一个特定的解决方案(文件),其中有一个特定类型化的数据集(例如“XyDataSet.xsd”) .在解决方案中,我有帮助类,例如。用于处理订单。此类中的方法之一可能是“GetOrder(string orderId)”,它使用客户特定的 DataSet 来检索订单(如键入的 DataRow)。

如您所见,我在每个客户的每个解决方案中都有“GetOrder”方法,因为订单表中可能存在一些差异,比如可能有额外的列。因此,如果需要对一般的“GetOrder”功能进行更改,我必须在所有项目中更改它,这当然是一场维护噩梦。

你们中有人看到可以改进此“架构”的方法吗?或者,也许当前底层不同的 DB 方案在更高的应用程序级别上没有太多改进?

最佳答案

这个问题很难完全回答,但我会开始这样想:

数据库级别:

  • 找到共同点并将其作为数据库模式。
  • 找到什么是加法并将其放在单独的表中,指示该表中哪个(来自通用模式)是行的所有者及其对应的值。例如

    订单 {OrderID、CustomerID 等}(这是所有者表)
    OrderExtensions {ExtensionID, ExtensionName, ExtensionValue}(这是订单的扩展表)
    OrderExtensionsToCustomers {CustomerID, ExtensionID}(这显示哪个扩展适用于哪个客户)

数据访问层级别:

  • 应在此处实现数据库级设计。

领域模型层级:

  • 一些功能操作(针对 UI 层)应移至此处。

UI层级:

  • 从这里应该将一些东西移到数据库层,例如仅对某些客户显示的 UI 元素,将它们视为仅为特定客户激活的“功能”(扩展),因此它们仅对他们可见。
  • 就我个人而言,我会更进一步抽象“功能”术语,使其可动态加载。如果您习惯使用反射,这很容易实现。如果可以实现这一点,那么您将有幸在域层中拥有少量代码 - 不是将所有客户的所有代码放在一起,而是在需要时根据请求为特定客户动态加载。

最终图片:

  • 客户访问 UI 界面,实际上是特定页面。
  • 数据库查询当前客户可用的 UI 功能(例如附加按钮等)。
  • 数据库为客户返回每个功能的定义。
  • 每个功能都动态加载并添加到页面(例如添加到功能的特殊占位符)。
  • 当功能需要执行时,它将请求传递给领域层,领域层依次加载该功能的“处理器”部分,可能也是动态的,或者只是找到需要调用的功能的实现。
  • 调用被路由到数据库,公共(public)信息被保存到公共(public)(所有者)表,而附加(扩展)信息被保存到其他(扩展)表。

我知道这是一个很长的答案,但我希望这是有道理的:-)

关于.net - 数据库结构略有不同的多客户项目的架构设计(针对每个客户),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com