首页 > 解决方案 > 不同的 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。有没有办法通过类继承或其他方式解决这个问题?

标签: c#inheritancedll

解决方案


您可以设计一个将使用构建器模式或工厂方法实现的类(使用一些创建模式,请阅读这些模式,它将帮助您减少代码库)。方法是设计一个将在任何地方使用的通用类。因此,您可以轻松修改它。你需要弄清楚如何区分你的dll。可以通过两种方式区分 Dll 的引用:

  1. 由程序集的全名(通常包括程序集的版本)。
  2. 或者您可以将所有 dll 加载到内存中并反射性地读取 dll 的版本。

区分版本后,您可以轻松地将所有 dll 放在一起并发布。所以,基本上你应该设计一个通用构建器,它将版本号作为参数并返回一个精心准备的 dll 平台。希望能帮助到你。


推荐阅读