Sitecore 8.1から8.2.5にアップグレードし、私たちが使用しているデータプロバイダの1つで、自分自身をコード化していないものはもはや動作していません。Sitecoreカーネルによってコンストラクタが呼び出されるように、Sitecore 8.2.5のdataproviderをどのように設定する必要がありますか?
これまで、Sitecoreカーネルはページの初期ロード時に呼び出されないコンストラクタにこの問題をトレースすることができ、データプロバイダが正しく動作しないようにしました。
私たちは設定ファイルで何も変更していませんが、私たちが知っているところでは、依存性注入の仕方が変わっています。
設定ファイルのエントリ:
<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は、常にコンストラクタが働いてから他の機能を防止する呼び出されることはありませんように空です。
ご協力いただきまして誠にありがとうございます。
注文の問題です。コードにプロバイダを追加する前に、RefreshHandlerに追加する必要があります。投稿されたコードには何も記録されません。私は構成がItemIconで返されていると思われ、何もItemIconで行われません。 – jdweng
コンストラクタが呼び出されず、このコードが決して実行されないので、このことはあまり重要ではないと思います。 – webster69
DataProviderクラスから呼び出されるdeserializeメソッドがあります。標準のNet Library Serialize Classは辞書で動作します。だから私はそれが辞書と関係があると思う。 Net Library Dictionary SerializeのWebを検索して、ソリューションを表示できます。 – jdweng