1

我正在使用IOrganizationService无法修改的预定义对象——它超出了我的控制范围。

并且默认情况下,这似乎IOrganizationService返回已解析的类型,就好像EnableProxyTypes()在 originating 某处被隐式调用一样OrganizationServiceProxy

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

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

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

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

问题在于以下。如果我们尝试序列化EarlyBouldLibrary.Account[]XML将会失败。因为EarlyBouldLibrary.Account未知。

好的,可以将类型添加到已知。但是不能保证,有一天会在NewEarlyBouldLibrary.dll...中找到另一种早期绑定类型,并且它们将具有名称NewEarlyBouldLibrary.Account...这是未知的...

好的,让我们假设序列化成功,无论引用哪种类型EarlyBouldLibrary.AccountNewEarlyBouldLibrary.Account但是如果我们尝试反序列化,在这些早期绑定库不存在的环境中......操作将失败。

因此,唯一的方法是不使用我们无法控制的特定早期绑定类型,并使用标准和安全Entity。但是系统自动解析代理类型是不可能的。

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

4

2 回答 2

1

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

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

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);
}
于 2015-09-16T11:43:19.790 回答
0

您可以添加[assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssembly]EarlyBouldLibrary.dll或程序集的 AssemblyInfo 文件中NewEarlyBouldLibrary.dll吗?

于 2015-09-17T17:30:17.947 回答