Отключить типы прокси для OrganizationServiceProxy
Я работаю с предопределенным 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
, Но это невозможно, пока система автоматически разрешает типы прокси.
Итак, вопрос: есть ли способ отключить разрешение ранних типов привязки?
2 ответа
Вы можете перенаправить свой прокси в другую сборку, содержащую нужные вам типы (или даже вообще не содержащие ранних типов).
Пример ниже сбрасывает сборку прокси:
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]
в файл AssemblyInfo EarlyBouldLibrary.dll
или же NewEarlyBouldLibrary.dll
сборка?