c# - 不同的 DLL 版本,一个代码库
问题描述
在我的项目中,我必须与公开大约 30 个不同 API DLL 的 ERP 系统进行交互。ERP 公司系统地创建了他们系统的新版本,我被迫将 DLL 更改为新版本。然而,并不是我所有的客户都更新了 ERP,所以我也被迫维护旧的参考资料。我目前对这个问题的解决方案是:
1) 对于每个 ERP 版本,我创建一个“ApiWrapper”项目,引用此 ERP 版本的 DLL。
2)在我的主要项目中,我引用了那些'ApiWrappers'并使用其中一个选定的。
'ApiWrapper' 内部的示例函数如下所示:
public void AddContractorAttribute(Ustawienia settings, string attributeCode, string attributeValue, int contractorId)
{
CreateNewSession();
CDNHeal.Kontrahenci AllContractors = (CDNHeal.Kontrahenci)session.CreateObject("CDN.Kontrahenci", null);
CDNHeal.IKontrahent SelectedContractor = (CDNHeal.IKontrahent)AllContractors[$"Knt_KntId = {contractorId}"];
CDNBase.ICollection AllAttributes = (CDNBase.ICollection)(session.CreateObject("CDN.DefAtrybuty", null));
CDNTwrb1.IDefAtrybut SelectedAttribute = (CDNTwrb1.IDefAtrybut)AllAttributes[$"dea_Kod = '{attributeCode}'"];
CDNTwrb1.IKntAtrybut NewAttributeValue = (CDNTwrb1.IKntAtrybut)SelectedContractor.Atrybuty.AddNew(null);
NewAttributeValue.DefAtrybut = (CDNTwrb1.DefAtrybut)SelectedAttribute;
NewAttributeValue.Wartosc = attributeValue;
session.Save();
}
现在,我遇到的问题是:如果我想在 ApiWrapper 中添加或更改一个函数,我必须在其中的每一个中都这样做。它们在代码方面没有区别,它们只引用一组不同的 DLL。有没有办法通过类继承或其他方式解决这个问题?
解决方案
您可以设计一个将使用构建器模式或工厂方法实现的类(使用一些创建模式,请阅读这些模式,它将帮助您减少代码库)。方法是设计一个将在任何地方使用的通用类。因此,您可以轻松修改它。你需要弄清楚如何区分你的dll。可以通过两种方式区分 Dll 的引用:
- 由程序集的全名(通常包括程序集的版本)。
- 或者您可以将所有 dll 加载到内存中并反射性地读取 dll 的版本。
区分版本后,您可以轻松地将所有 dll 放在一起并发布。所以,基本上你应该设计一个通用构建器,它将版本号作为参数并返回一个精心准备的 dll 平台。希望能帮助到你。
推荐阅读
- reactjs - React Route 无法渲染
- powershell - 如何在 Powershell 中使用先前的命令输出作为参数?
- webassembly - 如何使用 wasm-vips 对图像进行重新采样?
- c# - 使用 itext7 将 PNG 文件转换为 PDF 时出现权限问题,某些命令似乎可以访问其他命令
- c++ - 如何使两个函数 void decToBin(unsigned long d) 和 unsigned long binToDec(char b[]) 将数字从十进制转换为二进制,反之亦然
- javascript - 如何使用 JQuery 计算动态输入的价格和数量
- typescript - 我可以将 TypeScript 类型定义为 typeof 的所有可能结果值吗?
- java - 如何从服务器运行本地脚本?
- python - 如何设置图像大小以在 Ipython.display 中显示?
- redis - Redisson getAtomicLong - 如果密钥不存在怎么办?