Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating OrganizationServiceProxy in CRM2011 Plugin to use Early binding

We are trying to use early bound types in a CRM2011 plugin. To enable this it appears we need to either add a ProxyTypesBeavior(), or call EnableProxyTypes(). However, both of these properties apply to an OrganizationServiceProxy class, and do not exist on the IOrganizationService interface.

So if we are using the following code to get the organization service, how are we meant to obtain a proxy class to set the above properties on?

var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
var service = serviceFactory.CreateOrganizationService(context.UserId);
like image 372
Matt Avatar asked Oct 25 '22 07:10

Matt


2 Answers

For those of you using CRM Online, the reflection solution won't work since you're stuck in sandbox mode.

The following solution using the IProxyTypesAssemblyProvider interface (suggested by Pavel Korsukov) worked for me (source).

var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

var proxyTypesProvider = factory as IProxyTypesAssemblyProvider;
if (proxyTypesProvider != null)
{
    proxyTypesProvider.ProxyTypesAssembly = typeof(Xrm.XrmServiceContext).Assembly;
}
// Use the factory to generate the Organization Service.
var service = factory.CreateOrganizationService(context.UserId);
like image 115
Tom Faltesek Avatar answered Oct 30 '22 15:10

Tom Faltesek


Guil on this thread offered an option to use reflection to bind the code gen proxy types to the service factory. And it worked for me. Won't be able to register it in sandbox, as reflection needs full trust.

 factory.GetType().GetProperty("ProxyTypesAssembly").SetValue(factory, typeof(YourCrmContext).Assembly, null);

http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/bc7e93d4-1b36-4e21-9449-f51b67a2e52c/

like image 45
Jian Sun Avatar answered Oct 30 '22 14:10

Jian Sun