在源代码中实现和维护客户特定的差异

时间:2011-03-02 12:19:15

标签: c# stored-procedures etl

我有一个ETL应用程序,它从源数据库中提取数据(我只有读访问权限)并将其加载到我的SQL Server数据库中。使用带有硬编码SQL语句的C#应用​​程序的ODBC查询运行数据提取。加载由我的SQL Server数据库中的存储过程执行。这一切都很好,但随着客户端数量的增长,我不得不在提取(c#代码)和加载(存储过程)中引入一组客户特定的更改。

我的问题是处理这些客户特定差异的最佳方法是什么?

以下是我最初的可能解决方案,欢迎任何评论。感觉好像有更好的方法通过源代码控制来做到这一点?为不同的客户创建分支? (当前的源代码控制是SourceSafe,但我正在学习GIT,以期尽快实现)

申请代码(C#)

我目前的想法是添加app.config设置来识别客户端,并使用它来在提取中运行不同的方法。

存储过程(SQL Server)

我可以维护任何可能是客户端特定的程序的副本,后缀为客户端名称。然后在部署时,我可以删除其他客户端的程序,并重命名我想保留的程序。

所以说我有客户端A和客户端B我最终会得到3个版本的程序:

LoadDepartment()
LoadDepartmentClientA()
LoadDepartmentClientB()

在部署客户端A时,我删除LoadDepartment()和LoadDepartmentClientB(),然后将LoadDepartmentClientA()重命名为LoadDepartment()。

这意味着保留可能导致维护并发症的程序副本。

2 个答案:

答案 0 :(得分:1)

为每个客户创建一个dll,其中每个类由接口定义,以便明确规范。

在这个dll中,你会放入包含差异的类/方法。

客户特定组件的加载必须通过反射(assembly.loadfrom)

完成

示例:

你有一个CustomerA.dll和一个CustomerB.dll,它们都有一个带有方法Load的类Department。 类部门实现了CustomerHelper.dll中的IDepartment。

答案 1 :(得分:0)

一般来说,“代码/插件/配置”解决方案更清晰,更容易保留,但有时存储过程方式的优点是在生产环境中更容易动态更改。

通过企业管理器或类似工具很容易在存储过程中进行修复,但是在远程服务器上更改dll可能很困难。