禁用OrganizationServiceProxy

时间:2015-09-16 11:04:07

标签: c# dynamics-crm xrmtoolbox

我正在处理我无法修改的预定义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.AccountNewEarlyBouldLibrary.Account,但是如果我们将尝试反序列化,那么这些早期绑定库不存在的环境......行动将失败。

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

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

2 个答案:

答案 0 :(得分:0)

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

以下示例重置代理程序集:

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);
}

答案 1 :(得分:0)

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