Как мне настроить провайдер данных для Sitecore 8.2.5, чтобы его конструктор вызывался ядром Sitecore?

Мы обновили с Sitecore 8.1 до 8.2.5 и один из поставщиков данных, который мы используем, но сами не кодировали, больше не работает.

До сих пор мы могли отследить проблему до конструктора, никогда не вызываемого ядром Sitecore при начальной загрузке страницы, что препятствует нормальной работе провайдера данных.

Мы ничего не изменили в наших конфигурационных файлах, но, насколько нам известно, 8.2 изменило работу инъекций зависимостей.

Записи файла конфигурации:

<sitecore database="SqlServer">

<events timingLevel="none">
    <!-- Dataprovider Events -->
    <event name="item:saved">
        <handler type="Company.WCMS.PROJECT.Common.DataProvider.Dynamic.DynamicDataProviderNotification, Company.WCMS.PROJECT.Common" method="OnItemSaved"/>
    </event>
    <event name="item:saved:remote">
        <handler type="Company.WCMS.PROJECT.Common.DataProvider.Dynamic.DynamicDataProviderNotification, Company.WCMS.PROJECT.Common" method="OnItemSavedRemote"/>
    </event>
    <event name="publish:end">
        <handler type="Company.WCMS.PROJECT.Common.DataProvider.Dynamic.DynamicDataProviderNotification, Company.WCMS.PROJECT.Common" method="OnPublishComplete"/>
    </event>
    <event name="publish:end:remote">
        <handler type="Company.WCMS.PROJECT.Common.DataProvider.Dynamic.DynamicDataProviderNotification, Company.WCMS.PROJECT.Common" method="OnPublishComplete"/>
    </event>
    <!-- /Dataprovider Events -->
</events>

<pipelines>

    <publishItem>
    <processor patch:before="processor[@type='Sitecore.Publishing.Pipelines.PublishItem.DetermineAction, Sitecore.Kernel']" type="Company.WCMS.PROJECT.Common.DataProvider.PublishPreventer, Company.WCMS.PROJECT.Common" />
    </publishItem>

</pipelines>

<!-- DataProvider -->
<dataProviders>
    <DynamicDataProvider type="Company.WCMS.PROJECT.Common.DataProvider.Dynamic.DynamicDataProvider, Company.WCMS.PROJECT.Common" patch:before="*[@type='Sitecore.Data.$(database).$(database)DataProvider, Sitecore.Kernel']"/>
</dataProviders>
<!-- /DataProvider -->

<!-- DATABASES -->
<databases>
    <database id="master" singleInstance="true" type="Sitecore.Data.Database, Sitecore.Kernel">
        <param desc="name">$(id)</param>
        <icon>Images/database_master.png</icon>
        <dataProviders hint="list:AddDataProvider">
        <dataProvider ref="dataProviders/main" param1="$(id)">
            <prefetch hint="raw:AddPrefetch">
            <sc.include file="/App_Config/Prefetch/Common.config" />
            <sc.include file="/App_Config/Prefetch/Master.config" />
            </prefetch>
        </dataProvider>

            <!-- Custom Changes Start -->
        <dataProvider ref="dataProviders/DynamicDataProvider"  patch:after="*[@ref='dataProviders/main']"/>
            <!-- Custom Changes End -->

        </dataProviders>
    </database>
    ...
<databases>

Начало и конструктор нашего провайдера данных:

using System.Reflection;
using Sitecore.Diagnostics;

namespace Company.WCMS.PROJECT.Common.DataProvider.Dynamic
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;

using Sitecore.Caching;
using Sitecore.Collections;
using Sitecore.Data;
using Sitecore.Data.DataProviders;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;

using System.Collections.Concurrent;

using Name.Framework.ClassGenerator;

using Sitecore.Configuration;
using Sitecore.Events;
using Sitecore.Publishing;

public class DynamicDataProvider : DataProvider
{
    public static readonly ID OrginalFieldId = new ID("{f8ea7f10-f7f6-4c5a-a409-097728cc3f55}");

    private static readonly MD5CryptoServiceProvider Md5 = new MD5CryptoServiceProvider();
    private static readonly List<Action<IBaseSitecoreItem>> RefreshHandler = new List<Action<IBaseSitecoreItem>>();
    private static readonly List<Action<Database, bool>> ClearIdsHandler = new List<Action<Database, bool>>();

    private readonly HashSet<ID> rootItems = new HashSet<ID>();
    private readonly ConcurrentDictionary<ID, HashSet<ID>> realToFakeId = new ConcurrentDictionary<ID, HashSet<ID>>();
    private readonly ConcurrentDictionary<ID, FakeIdBucket> fakeCache = new ConcurrentDictionary<ID, FakeIdBucket>();
    private readonly List<IDynamicDataProvider> providers = new List<IDynamicDataProvider>();
    private readonly Dictionary<ID, List<IDynamicDataProvider>> tempalteToProviders = new Dictionary<ID, List<IDynamicDataProvider>>();

    private static string ItemIcon = Settings.GetSetting("Leister.Internet.DataProvider.ItemIcon", string.Empty);

    public static event Func<IBaseSitecoreItem, bool> RefreshItem;

    public DynamicDataProvider()
    {

        this.LoadProviders();

        RefreshHandler.Add(this.RefreshLocal);
        ClearIdsHandler.Add(this.ClearIds);
    }

RefreshHandler всегда пуст, так как конструктор никогда не вызывается, что препятствует работе других функций.

Любая помощь с благодарностью.

1 ответ

Решение

Как мы и подозревали, это была проблема в файлах конфигурации. Sitecore изменил имя типа Database с Database на DefaultDatabase, и мы этого не заметили, поэтому наш патч ссылался на неправильный тип. Мы настроили это, и теперь это работает.

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