当我们想要在C#中开发CRM库(管理员)时,我们正面临着这个问题,它将支持与多个CRM系统的通信 - 即您同时运行多个CRM实例的情况(例如两个不同的组织)。
CRM库的要求:
使用早期绑定而不是后期绑定(因为类型安全)
能够通过一位经理与更多CRM系统(组织)进行沟通
只有一种方法可以用于所有CRM系统(组织)的一次操作(避免代码重复) - 有必要为每个组织创建一个用于解析生成的实体文件(crmsvcutil工具)的实用程序。解析的结果将是实体文件中定义的实体的接口列表和部分类。接口将根据它们包含的属性在部分类中实现,例如IAccountNumber等。将有两组接口 - 第一组用于两个组织中共同的实体属性,例如interface ICrmAccount将定义AccountNumber,Name,Address1属性等。第二组接口将用于实体唯一的属性,并且不存在于所有CRM系统(组织)的实体中。一般的CRM管理器将提供所有通信方法,如CreateAccount(),GetAccount()等,由于实现了接口,它将与特定的CRM系统一起使用。
我们设计了一个解决方案,现在可以与两个不同的CRM系统进行通信,但是它无法使用特定帐户的实现接口,请参阅包含代码注释的随附解决方案。
解决方案可以在这里找到:
解决方案描述:
CRM_BusinessLogic - 包含CRMManager,它包含所有通信方法并在构造函数中初始化正确的数据上下文
CRM_Interfaces - 包含所有生成的接口,这些接口是实体文件解析的结果(这必须使用单独的解析工具完成)。现在只包含iCRMAccount,它只包含两个组织和iCRMContext共有的一个属性,它包含在两个数据上下文中实现的实体 - 现在两个上下文都实现了相同的实体帐户。
CRM_SCEurope - 包含第一个CRM组织生成的实体文件SC Europe - SCEuropeEntities.cs,由解析工具生成的数据上下文(实现组织上下文中实体存在的接口列表) - SCEuropeContext_generated和SCEuropeContext.cs返回正确的程序集
CRM_SoSW - 与CRM_SCEurope相同的内容,包含与第二个CRM组织相关的数据
CRM_Test - 包含将与两个组织进行通信的测试控制台应用程序
请注意,随附的解决方案仅包含仅具有Name参数的Account实体,该参数足以进行设计解决方案的基本测试。
重要说明:在运行项目之前,您必须在Program.cs文件(CRM_Test项目)中为管理器设置凭据。
正如您所看到的,如果使用生成的部分类(SoSwContext,SCEuropeContext)和实现的接口iCRMContext从CRM加载帐户数据,应用程序会抛出异常“无效”,其中'条件。实体成员正在调用无效属性或方法 - 参见方法实现。“。
如果有人能找到解决异常的解决方案,我们将不胜感激。
由于
的Pavel
答案 0 :(得分:1)
对于我现在的雇主,他们有多个CRM组织,有些几乎相同,我们实际上能够使用完全相同的早期绑定类,并使用20行自定义代码来处理差异。其他组织不是,因此我们有一个单独的dll,其中包含组织特定的命名空间,其中包含生成的早期绑定类型。没有理由他们不能都在同一个dll中,但是如果它们都在同一个命名空间中你就会遇到问题,因为每个都会定义它自己的Contact,Appointment等定义。
请记住,只要您不尝试选择或更新不存在的特定字段或实体,就可以将早期绑定类型用于其他组织。因此,如果Org 1在Contact实体上有一个CompanyId,而Org 2没有,那么只要你没有填充CompanyId(即放置它),你仍然可以使用Org 1的早期绑定类型,即Org 2。实体参数集合)