当我们想用 C# 开发一个支持与多个 CRM 系统通信的 CRM 库(管理器)时,我们遇到了这个问题——即同时运行多个 CRM 实例(例如两个不同的组织)的情况)。
CRM 库的要求:
使用 early-bound 而不是 late-bound(因为类型安全)
能够通过一名经理与更多的CRM系统(组织)进行沟通
对于所有 CRM 系统(组织)仅使用一种操作(避免代码重复)的一种方法 - 有必要为每个组织创建一个用于解析生成的实体文件的实用程序(crmsvcutil 工具)。解析的结果将是实体文件中定义的实体的接口和部分类的列表。接口将根据它们包含的属性在部分类中实现,如 IAccountNumber 等。将有两组接口 - 第一组用于两个组织中共有的实体属性,例如接口 ICrmAccount 将定义 AccountNumber、Name、Address1 属性等. 第二组接口将用于实体唯一且不存在于所有 CRM 系统(组织)的实体中的属性。
我们设计了一个解决方案,该解决方案现在能够与两个不同的 CRM 系统进行通信,但它无法为特定帐户使用已实现的接口,请参阅包含代码注释的随附解决方案。
可以在这里找到解决方案:
解决方案说明:
CRM_BusinessLogic - 包含 CRMManager,它保存所有通信方法并在构造函数中初始化正确的数据上下文
CRM_Interfaces - 包含所有生成的接口,这些接口是实体文件解析的结果(这必须使用单独的解析工具来完成)。现在只包含 iCRMAccount 只包含两个组织和 iCRMContext 共有的一个属性,其中包含在两个数据上下文中实现的实体 - 现在两个上下文都实现相同的实体 Account。
CRM_SCEurope - 包含为第一个 CRM 组织 SC Europe 生成的实体文件 - SCEuropeEntities.cs,由解析工具生成的数据上下文(根据组织上下文中存在的实体实现接口列表) - SCEuropeContext_generated 和返回正确的 SCEuropeContext.cs部件
CRM_SoSW - 与 CRM_SCEurope 相同的内容,包含与第二个 CRM 组织相关的数据
CRM_Test - 包含将与两个组织进行通信的测试控制台应用程序
请注意,随附的解决方案仅包含具有名称参数的帐户实体,足以对设计的解决方案进行基本测试。
重要提示:在运行项目之前,您必须在 Program.cs 文件(CRM_Test 项目)中为经理设置凭据。
如您所见,如果使用生成的部分类(SoSwContext、SCEuropeContext)从 CRM 加载帐户数据并实现接口 iCRMContext,应用程序会抛出异常“无效的‘where’条件。实体成员正在调用无效的属性或方法- 查看方法实现。”。
如果有人能找到解决异常的方法,我们将不胜感激。
谢谢
帕维尔