禁用OrganizationServiceProxy的代理类型
本文关键字:类型 代理 OrganizationServiceProxy 禁用 | 更新日期: 2023-09-27 18:13:03
我正在使用预定义的IOrganizationService
对象,我无法修改-这是我无法控制的。
似乎默认情况下,IOrganizationService
返回已解析的类型,就好像EnableProxyTypes()
在原始OrganizationServiceProxy
的某个地方被隐式调用。
这破坏了所有的业务逻辑,因为早期绑定的实体不能那么容易地序列化,因为在不同的安装上它们可以解析为不同的类型。因此,即使它们被成功序列化,也不能100%确定它们可以被反序列化。
更具体地说,它是XrmToolBox
插件。如果托管应用程序加载了使用早期绑定的插件,这些生成的类型将通过反射发现,并应用于Retrieve
和RetrieveMultiple
调用的结果。
例如,RetrieveMultiple
到account
的实体响应通常包含Entity[]
,该数组的每一项都将LogicalName
属性设置为account
。
但是如果在汇编中发现了早期的绑定类型,我们称它为EarlyBouldLibrary.dll
,同样的RetrieveMultiple
将返回EarlyBouldLibrary.Account[]
。该数组的每一项都将从Entity
派生,并且包含与第一个示例相同的字段,但具有额外的属性。
问题在下面。如果我们尝试将EarlyBouldLibrary.Account[]
序列化到XML
,它将失败。因为EarlyBouldLibrary.Account
是未知的。
好的,可以向已知添加类型。但是不能保证,有一天会在NewEarlyBouldLibrary.dll
中发现另一个早期绑定类型…他们的名字是NewEarlyBouldLibrary.Account
…这是未知的…
好吧,让我们假设序列化成功了,不管引用的类型是EarlyBouldLibrary.Account
还是NewEarlyBouldLibrary.Account
,但是如果我们要尝试反序列化,在这些早期绑定库不存在的环境下…
所以唯一的方法是不使用特定的早期绑定类型,这超出了我们的控制,并使用标准和安全的Entity
。但是当系统自动解析代理类型时,这是不可能的。
那么,问题是:有没有办法禁用早期绑定类型的解析?
您可以将代理重定向到包含所需类型(甚至根本不包含早期绑定类型)的另一个程序集。
下面的示例重置代理程序集:
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.dll
或NewEarlyBouldLibrary.dll
程序集的AssemblyInfo文件中?