2015-08-13 1 views
1

Я пытаюсь создать экземпляр IOrganizationServiceFactory, поскольку я хочу создать несколько потоков для подключения к концу службы. Чтобы создать несколько контекстно-зависимых контекстов службы, вы можете использовать фабрику. Однако я не могу создать его.Создать IOrganizationServiceFactory в консольном приложении для Dynamics CRM 2013

Возможно ли это в приложении консоли C# или оно ограничено только для плагинов и рабочих процессов?

Я могу создать OrganizationServiceProxy, однако я не знаю, как исходить отсюда.

Это код, который я в настоящее время:

var serverName = (string)ConfigurationManager.AppSettings["OrganisationUrl"]; 
Uri organisationUri = new Uri(string.Format("{0}/XRMServices/2011/Organization.svc", serverName)); 
Uri homeRealmUri = null; 
ClientCredentials credentials = new ClientCredentials(); 
credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; 


var serviceProxy = new OrganizationServiceProxy(organisationUri, homeRealmUri, credentials, null); 
+0

Есть ли причина, по которой IOrganizationServiceFactory кажется правильным? Я бы рекомендовал просто использовать класс OrganizationService из библиотеки Microsoft.Xrm.Client, чтобы упростить соединение. Вы должны иметь возможность создавать несколько из них в отдельных потоках и быть в порядке. – BlueSam

+0

Библиотека 'Microsoft.Xrm.Client' не поддерживает создание экземпляров' IOrganizationService' для нескольких потоков; он обрабатывает/кэширует только один экземпляр за раз. Кроме того, конфигурация привязана к app.config. Я предполагаю, что он был разработан с учетом особенностей WinForms и WPF. –

ответ

2

Вы можете создать класс, реализующий интерфейс IOrganizationServiceFactory. Этот класс может быть ответственен за создание и выпуск экземпляров IOrganizationService.

Я сделал простой пример:

class OrganizationServiceFactory: IOrganizationServiceFactory, IDisposable 
{ 
    private readonly ConcurrentBag<OrganizationServiceProxy> _issuedProxies = 
     new ConcurrentBag<OrganizationServiceProxy>(); 

    public IOrganizationService CreateOrganizationService(Guid? userId) 
    { 
     var serverName = (string)ConfigurationManager.AppSettings["OrganisationUrl"]; 
     Uri organisationUri = new Uri(string.Format("{0}/XRMServices/2011/Organization.svc", serverName)); 
     var credentials = new ClientCredentials(); 
     credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; 

     var serviceProxy = new OrganizationServiceProxy(organisationUri, null, credentials, null); 
     _issuedProxies.Add(serviceProxy); 
     return serviceProxy; 
    } 

    public void Dispose() 
    { 
     foreach (var serviceProxy in _issuedProxies) 
     { 
      serviceProxy.Dispose(); 
     } 
    } 
} 

Клиенты фабрики могут получить IOrganizationService экземпляров по телефону CreateOrganizationService(Guid? userId), но не может быть ответственным за утилизацией прокси. Завод сделает это за них.

B.t.w, вы можете сделать создание нескольких прокси-экземпляров более эффективным с использованием интерфейса IServiceManagement<IOrganizationService>, но это еще одна тема.

Вы можете найти эту статью в MSDN полезной: Optimize CRM 2011 Service Channel allocation for multi-threaded processes.