Разработка
01
Окт
0

CachedOrganizationService

Использование CachedOrganizationService при создании Service Context позволяет автоматически кэшировать запросы и тем самым улучшать производительность приложения, взаимодействующего с CRM. При этом результат каждого запроса будет сохраняться и если будет выполнен похожий запрос, то результат будет возвращен из кэша, вместо реального обращения к серверу.

В следующем примере второй запрос не будет обращается к серверу, а берет данные из кэша который образовался в результате первого запроса). Если же другой запрос, возвращает отличные от первого атрибуты (или имеет другие фильтры), то запрос отправится на сервер, чтобы получить дополнительные значения:

using System;
using System.Collections.Generic;
using System.Data.Services;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Client;

using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace Cach
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://win-ebu0m4kvf06/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            
            IOrganizationService service = (IOrganizationService)proxy;
            CachedOrganizationService сachedservice = new CachedOrganizationService(service);

            using (CrmOrganizationServiceContext context = new CrmOrganizationServiceContext(сachedservice))
            {
                QueryByAttribute request = new QueryByAttribute("account");
                request.Attributes.Add("name");
                request.Values.Add("Big Account");
                request.ColumnSet = new ColumnSet("name");

                // Первый запрос отправляется на сервер
                EntityCollection acc1 = сachedservice.RetrieveMultiple(request);

                // Второй запрос возвращается из кэша
                EntityCollection acc2 = сachedservice.RetrieveMultiple(request);

                // Если другой запрос, возвращает отличные от первого атрибуты (или имеет другие фильтры), 
                // то запрос отправится на сервер, чтобы получить дополнительные значения:
                QueryByAttribute request2 = new QueryByAttribute("account");
                request.Attributes.Add("name");
                request.Values.Add("Big Account");
                request.ColumnSet = new ColumnSet("name", "accountnumber");

                // Этот запрос отправится на сервер, потому что изменились условия запроса
                EntityCollection acc3 = сachedservice.RetrieveMultiple(request);
            }
        }
    }
}

Примечание:

  • По умолчанию CachedOrganizationSevice возвращает клонированный экземпляр кэшируемых результатов, но его можно настроить для возвращения тех же экземпляров:
    ((CachedOrganizationService)сachedservice).Cache.ReturnMode = OrganizationServiceCacheReturnMode.Shared;
  • При обновлении или удалении записи, которая присутствует в кэшируемой результате запроса, то кэш автоматически становится неактуальным, и будет обновлен при следующем запросе;
  • Одним из способов получать не кэшируемые данные является использование нэкэштруемого OrganizationServiceContext. Кроме того, класс CachedOrganizationService представляет свойство Cache, которое является экземпляром IOrganizationServiceCache. Именно этот экземпляр IOrganizationServiceCache представляет методы, которые позволяют удалить элементы из кэша, используемого контекстом. Следующий метод можно использовать для удлаения данные записи из набора данных, кэшируемых контекстом:
public void RemoveCachedData(OrganizationServiceContext context, string entityLogicalName, Guid? id)
{
    var serviceContainer = context as IOrganizationServiceContainer;
    if (serviceContainer == null)
    {
        return;
    }

    var cachedOrgService = serviceContainer.Service as CachedOrganizationService;
    if (cachedOrgService == null)
    {
        return;
    }

    var orgServiceCache = cachedOrgService.Cache as IOrganizationServiceCache;
    if (orgServiceCache == null)
    {
        return;
    }

    orgServiceCache.Remove(entityLogicalName, id);
}


Комментарии (0)

*

code