0

当我们想用 C# 开发一个支持与多个 CRM 系统通信的 CRM 库(管理器)时,我们遇到了这个问题——即同时运行多个 CRM 实例(例如两个不同的组织)的情况)。

CRM 库的要求:

  1. 使用 early-bound 而不是 late-bound(因为类型安全)

  2. 能够通过一名经理与更多的CRM系统(组织)进行沟通

  3. 对于所有 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’条件。实体成员正在调用无效的属性或方法- 查看方法实现。”。

如果有人能找到解决异常的方法,我们将不胜感激。

谢谢

帕维尔

4

1 回答 1

1

对于我现在的雇主,他们有多个 CRM 组织,有些几乎完全相同,我们实际上能够使用完全相同的早期绑定类,并使用 20 行自定义代码来处理差异。其他组织没有,因此我们有一个单独的 dll,其中包含组织特定的命名空间,其中包含生成的早期绑定类型。没有理由它们不能都在同一个 dll 中,但是如果它们都在同一个命名空间中,你就会遇到问题,因为每个都会为联系人、约会等定义自己的定义。

请记住,您可以将早期绑定类型用于不同的组织,只要您不尝试选择或更新不存在的特定字段或实体。因此,如果 Org 1 在 Contact 实体上有 CompanyId,而 Org 2 没有,您仍然可以为 Org 1 和 Org 2 使用早期绑定类型,只要您不填充 CompanyId(即把它放在实体参数集合)

于 2013-05-13T12:31:24.193 回答