禁用OrganizationServiceProxy的代理类型

本文关键字:类型 代理 OrganizationServiceProxy 禁用 | 更新日期: 2023-09-27 18:13:03

我正在使用预定义的IOrganizationService对象,我无法修改-这是我无法控制的。

似乎默认情况下,IOrganizationService返回已解析的类型,就好像EnableProxyTypes()在原始OrganizationServiceProxy的某个地方被隐式调用。

这破坏了所有的业务逻辑,因为早期绑定的实体不能那么容易地序列化,因为在不同的安装上它们可以解析为不同的类型。因此,即使它们被成功序列化,也不能100%确定它们可以被反序列化。

更具体地说,它是XrmToolBox插件。如果托管应用程序加载了使用早期绑定的插件,这些生成的类型将通过反射发现,并应用于RetrieveRetrieveMultiple调用的结果。

例如,RetrieveMultipleaccount的实体响应通常包含Entity[],该数组的每一项都将LogicalName属性设置为account

但是如果在汇编中发现了早期的绑定类型,我们称它为EarlyBouldLibrary.dll,同样的RetrieveMultiple将返回EarlyBouldLibrary.Account[]。该数组的每一项都将从Entity派生,并且包含与第一个示例相同的字段,但具有额外的属性。

问题在下面。如果我们尝试将EarlyBouldLibrary.Account[]序列化到XML,它将失败。因为EarlyBouldLibrary.Account是未知的。

好的,可以向已知添加类型。但是不能保证,有一天会在NewEarlyBouldLibrary.dll中发现另一个早期绑定类型…他们的名字是NewEarlyBouldLibrary.Account…这是未知的…

好吧,让我们假设序列化成功了,不管引用的类型是EarlyBouldLibrary.Account还是NewEarlyBouldLibrary.Account,但是如果我们要尝试反序列化,在这些早期绑定库不存在的环境下…

所以唯一的方法是不使用特定的早期绑定类型,这超出了我们的控制,并使用标准和安全的Entity。但是当系统自动解析代理类型时,这是不可能的。

那么,问题是:有没有办法禁用早期绑定类型的解析?

禁用OrganizationServiceProxy的代理类型

您可以将代理重定向到包含所需类型(甚至根本不包含早期绑定类型)的另一个程序集。

下面的示例重置代理程序集:

private void ResetProxyAssembly(IOrganizationService service)
{
    var serviceProxy = (OrganizationServiceProxy) service;
    serviceProxy.EnableProxyTypes();
}

在某些情况下,这可能不起作用。相反,您可以显式选择所需的代理程序集:

private void ResetProxyAssembly(IOrganizationService service)
{
    var serviceProxy = (OrganizationServiceProxy) service;
    serviceProxy.EnableProxyTypes(typeof(MyEarlyBoundEntity).Assembly);
}

能否将[assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssembly]添加到EarlyBouldLibrary.dllNewEarlyBouldLibrary.dll程序集的AssemblyInfo文件中?