0

オブジェクトの小さなリストを保存し、Web サイトの開始ページへの依存関係を作成したいと考えています。したがって、開始ページが変更されたときにキャッシュの無効化を強制します。これは、古いキャッシュの実装で簡単に実行できましたが、現在は廃止されています。

ドキュメントには、CacheEvictionPolicy クラスを使用する必要があると記載されています。しかし、このクラスで依存関係をセットアップする方法がわかりません。

私の質問は次のとおりです: EPiServer 7.5 で EPiServer コンテンツ (IContent) に依存するオブジェクトをどのようにキャッシュしますか?

4

2 に答える 2

2

DataFactoryCache.CreateDependency()を使用してキャッシュの依存関係を作成できるはずです。ContentReferenceをパラメーターとして指定することをサポートしています。たとえば、ContentReference.StartPage を使用すると、開始ページが更新されたときにキャッシュ エントリをクリアできます。

また、これの多くは (EPiServer 6 ではありますが) まだ有効です: http://tedgustaf.com/blog/2010/5/cache-objects-in-episerver-with-page-dependencies/

あなたが達成する必要があることを私が誤解していない限り?

編集: EPiServer 7.5+ の場合、次のようにCacheEvictionPolicyを使用する必要があります。

EPiServer.CacheManager.Insert(
                key,
                item,
                new CacheEvictionPolicy(
                    new List<string>() { DataFactoryCache.PageCommonCacheKey(dependencyLink) }
                )
            );
于 2015-03-30T15:17:40.780 に答える
0

私はこれを解決することができました。ここにある方法を使用します。

次のような単純な実装を作成しました(スレッドセーフではありません):

    private static ISynchronizedObjectInstanceCache _cacheInstance;
    public static ISynchronizedObjectInstanceCache CacheImplementation
    {
        get
        {
            return (_cacheInstance ?? (_cacheInstance = ServiceLocator.Current.GetInstance<ISynchronizedObjectInstanceCache>()));
        }
        set
        {
            _cacheInstance = value;
        }
    } 
    public IList<MyObject> GetCachedObjects()
    {
        if (_cachedObjects == null)
        {
            object value = CacheImplementation.Get("MyObjectsCacheKey");
            if (value == null)
            {
                // Lookup objects (the slow function that triggered the need for caching)
                _cachedObjects = LookupMyObjects();
                string currentLanguage = ContentLanguage.PreferredCulture.Name;

                // Create dependencies and add to cache
                List<string> cacheDependencyKeys = new List<string>();

                // Add dependency to the start page
                cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(ContentReference.StartPage, currentLanguage));

                // Add dependency to the pointed out startpoint of the lookup of "MyObjects" (if not null)
                // This will force a cache invalidation when the page itself or it's children are changed.
                if (CurrentPage.MyObjectsStartPoint != null)
                {
                    cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(CurrentPage.MyObjectsStartPoint, currentLanguage));
                    cacheDependencyKeys.Add(DataFactoryCache.ChildrenCacheKey(CurrentPage.MyObjectsStartPoint));
                }
                // Do insert into cache
                CacheImplementation.Insert("MyObjectsCacheKey", _cachedObjects, new CacheEvictionPolicy(cacheDependencyKeys.ToArray()));
            } else 
            {
                _cachedObjects = value as IList<MyObject>;    
            }
        }
        return _cachedObjects;
    } private IList<MyObject> _cachedObjects = null;

編集: IObjectInstanceCache の代わりに ISynchronizedObjectInstanceCache に変更されました。EPiServer の「CacheManager」クラスはこの実装を使用し、サーバー間のキャッシュの無効化を処理することになっています。

于 2015-03-31T10:07:33.787 に答える