我正在处理我无法修改的预定义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
。但是系统自动解析代理类型是不可能的。
所以,问题:有没有办法禁用早期绑定类型的解析?
答案 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.dll
或NewEarlyBouldLibrary.dll
程序集的AssemblyInfo文件中吗?