2017-10-06 25 views
0

Sitecore 8.1에서 8.2.5로 업그레이드하고 우리가 사용하는 dataprovider 중 하나는 스스로 코딩하지 않았지만 더 이상 작동하지 않습니다.Sitecore 커널에 의해 생성자가 호출되도록 Sitecore 8.2.5에 대한 dataprovider를 어떻게 구성해야합니까?

지금까지 우리는 페이지의 초기 로딩에서 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> 

는 시작과 우리의 dataProvider의 생성자 :

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 클래스에서 호출되는 deserialize 메서드가 있습니다. 표준 Net Library Serialize 클래스는 사전과 함께 작동합니다. 그래서 사전과 관련이 있다고 생각합니다. Net Library Dictionary Serialize를 검색하면 솔루션을 볼 수 있습니다. – jdweng

답변

1

구성 파일에 문제가있는 것으로 의심됩니다. Sitecore가 데이터베이스 유형 이름을 Database에서 DefaultDatabase로 변경 했으므로 Sitemore는이를 인식하지 못 했으므로 우리의 패치가 잘못된 유형을 참조했습니다. 우리는 그것을 조정했고 이제는 작동합니다.