我有一个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()。
这意味着保留可能导致维护并发症的程序副本。
答案 0 :(得分:1)
为每个客户创建一个dll,其中每个类由接口定义,以便明确规范。
在这个dll中,你会放入包含差异的类/方法。
客户特定组件的加载必须通过反射(assembly.loadfrom)
完成示例:
你有一个CustomerA.dll和一个CustomerB.dll,它们都有一个带有方法Load的类Department。 类部门实现了CustomerHelper.dll中的IDepartment。
答案 1 :(得分:0)
一般来说,“代码/插件/配置”解决方案更清晰,更容易保留,但有时存储过程方式的优点是在生产环境中更容易动态更改。
通过企业管理器或类似工具很容易在存储过程中进行修复,但是在远程服务器上更改dll可能很困难。