2017-10-06 31 views
0

我们从Sitecore 8.1升级到8.2.5,并使用其中一个数据提供程序,但没有自行编码不再工作。如何为Sitecore 8.2.5配置一个数据提供器,使其构造函数由Sitecore内核调用?

到目前为止,我们可以追踪到构造函数永远不会被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永远是空的,因为构造函数没有被调用,防止其他功能无法正常工作。

任何帮助,非常感谢。

+0

这是订单问题。在代码中添加任何提供程序之前,您必须添加到RefreshHandler。代码中也没有发布任何内容。我怀疑这个配置是在ItemIcon中返回的,而且没有任何东西是用ItemIcon完成的。 – jdweng

+0

我不认为这很重要,因为构造函数从来没有被调用过,并且此代码从未运行。 – webster69

+0

有一个从DataProvider类中调用的反序列化方法。标准的Net Library Serialize Class可以与字典一起工作。所以我怀疑它与字典有关。您可以在网络上搜索Net Library Dictionary Serialize以查看解决方案。 – jdweng

回答

1

正如我们怀疑这是配置文件中的问题。 Sitecore将数据库类型名称从数据库更改为DefaultDatabase,但我们没有注意到,因此我们的补丁引用了错误的类型。我们调整了它,现在它工作。

相关问题