Отключить типы прокси для 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 сборка?

Другие вопросы по тегам