首页 > 解决方案 > 从同一库的不同版本返回类型转换

问题描述

我面临一个问题,我觉得答案应该很明显,但我错过了一些简单的东西,它只是让我无法理解:)

我正在开发一个必须与两个不同版本的 Dynamics CRM 对话的应用程序,这是由于迁移期重叠。我选择使用独立于 CRM 版本的简单数据对象来实现所有业务流程,并使用两个连接器作为插件(单独的 csproj 项目),在其中我为每个 CRM 版本实现连接/查询特定代码。

然后我有一个映射器项目,我还定义了一个插件继承的接口,以便我可以自由切换它们。在这个映射器中,我使用工厂来实例化适当的连接器,具体取决于我想与哪个 CRM 交谈(在运行时决定),然后将我需要的所有数据提取到数据对象中并将它们传递给业务流程处理程序。

插件连接器必须引用适当的 MS Xrm nuget 来连接和查询相应的 CRM。(Microsoft.CrmSdk.CoreAssemblies 和 Microsoft.PowerPlatform.Dataverse.Client)这些库是不同的版本,针对不同的 .NET 版本,但包含相同的命名空间和类型(特别是 EntityCollection 类型,它是每个查询的结果)

由于插件引用了不同的 XRM 库,EntityCollection 虽然在同一个命名空间中是相同的类型,但每次都源自不同的程序集版本,我需要在我的插件接口中定义这个返回类型,并且能够检索和使用 EntityCollection 中的映射器忽略其包含的程序集版本。

这里的问题是驻留在同一包的不同版本中的相同类型之间的类型转换,接口中的方法定义和返回类型,以及必须在映射器项目中引用哪个库才能定义该接口。

我发现这个线程 类型转换来自同一程序集的不同版本的相同类型 实际上表明它是不可行的,但我并不完全相信......你怎么看?

标签: c#dynamics-crm.net-assembly

解决方案


我现在已经解决了一个可能被称为“可怕的黑客”的问题:-P

映射器项目仍然以 .NET5 为目标,现在直接引用新的客户端库,因此可以从较新的 sdk 访问 Entity 和 EntityCollection 类型。

包装旧 Xrm 库的插件不再是插件,而是具有自己的 .Net Framework 4.5 运行时的独立服务应用程序。在向本地 CRM 发出成功请求后,此服务将 EntityCollection 结果序列化并将其作为 Json 发送到映射器,在该映射器中使用 DataContractJsonSerializer 将其反序列化为更新版本的 EntityCollection

我的比较还没有显示出任何不兼容性,所以现在以这种方式恢复 EntityCollection 是可行的。

现在我必须为 OrganizationRequest 做同样的事情,我希望它也能工作:=)

感谢您的提示和建议


推荐阅读