zoukankan      html  css  js  c++  java
  • 微软企业库的Cache

    微软企业库的Cache

    通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。基于微软的企业库,我们的快速创建一个缓存的实现。

    新建PrismSample.Infrastructure.Cache

    新建一个类库项目,将其命名为PrismSample.Infrastructure.Cache,然后从nuget中下载微软企业库的Cache。
    Image

    然后新建我们的CacheManager类:

    using Microsoft.Practices.EnterpriseLibrary.Caching;
    using System.ComponentModel.Composition;
    
    namespace PrismSample.Infrastructure.Cache
    {
        [Export("PrismSampleCache", typeof(ICacheManager))]
        public class CacheManager : ICacheManager
        {
            ICacheManager _cacheManager;
    
            public CacheManager()
            {
                _cacheManager = CacheFactory.GetCacheManager("MemoryCacheManager");
            }
    
            public object this[string key]
            {
                get
                {
                    return _cacheManager[key];
                }
            }
    
            public int Count
            {
                get
                {
                    return _cacheManager.Count;
                }
            }
    
            public void Add(string key, object value)
            {
                _cacheManager.Add(key, value);
            }
    
            public void Add(string key, object value, CacheItemPriority scavengingPriority, ICacheItemRefreshAction refreshAction, params ICacheItemExpiration[] expirations)
            {
                _cacheManager.Add(key, value, scavengingPriority, refreshAction, expirations);
            }
    
            public bool Contains(string key)
            {
                return _cacheManager.Contains(key);
            }
    
            public void Flush()
            {
                _cacheManager.Flush();
            }
    
            public object GetData(string key)
            {
            return  _cacheManager.GetData(key);
            }
    
            public void Remove(string key)
            {
                _cacheManager.Remove(key);
            }
        }
    }

    其中MemoryCacheManager是我们稍后需要在App.config文件中配置的。

    修改生成后事件:

    xcopy "$(TargetPath)" "$(SolutionDir)PrismSampleinDebug" /Y

    Image

    之所以添加生成后事件,是因为Cache的类库的引入不是通过Project间的项目引用来实现的,是在运行时MEF的容器去寻找指令集,所以我们把程序集都放置到运行目录下。

    修改App.config配置文件

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching" />
        </configSections>
            <startup> 
                <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
            </startup>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Practices.ServiceLocation" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
            </dependentAssembly>
            </assemblyBinding>
        </runtime>
        <cachingConfiguration defaultCacheManager="MemoryCacheManager">
            <cacheManagers>
            <add name="MemoryCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching" expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000" numberToRemoveWhenScavenging="10" backingStoreName="NullBackingStore" />
            </cacheManagers>
            <backingStores>
            <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching"
                name="NullBackingStore" />
            </backingStores>
        </cachingConfiguration>
    </configuration>

    配置文件的生成可以通过微软企业库的工具(配置方式)

    修改Bootstrapper,将目录下符合条件的dll全部导入

    using Prism.Mef;
    using PrismSample.Infrastructure.Abstract.Presentation.Interface;
    using System.ComponentModel.Composition.Hosting;
    using System.Windows;
    using Prism.Logging;
    using PrismSample.Infrastructure.Logger;
    using System.IO;
    using System;
    
    namespace PrismSample
    {
        public class Bootstrapper : MefBootstrapper
        {
            private const string SEARCH_PATTERN = "PrismSample.Infrastructure.*.dll";
    
            protected override DependencyObject CreateShell()
            {
                IViewModel shellViewModel = this.Container.GetExportedValue<IViewModel>("ShellViewModel");      
                return shellViewModel.View as DependencyObject;
            }
    
            protected override void InitializeShell()
            {
                Application.Current.MainWindow = (Shell)this.Shell;
                Application.Current.MainWindow.Show();
            }
    
            protected override void ConfigureAggregateCatalog()
            {
                base.ConfigureAggregateCatalog();
    
                //加载自己
                this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(this.GetType().Assembly));
    
                //加载当前目录
                DirectoryInfo dirInfo = new DirectoryInfo(@".");
                foreach (FileInfo fileInfo in dirInfo.EnumerateFiles(SEARCH_PATTERN))
                {
                    try
                    {
                        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(fileInfo.FullName));
                    }
                    catch (Exception ex)
                    {
                        this.Logger.Log( string.Format("导入异常:{0}", ex.Message), Category.Exception, Priority.None);
                    }
                }
            }
    
            protected override ILoggerFacade CreateLogger()
            {
                return new Logger();
            }
        }
    }

    测试运行

    修改ShellViewModel的构造函数

    [ImportingConstructor]
    public ShellViewModel([Import("ShellView", typeof(IView))]IView view, 
                            [Import]ILoggerFacade logger, 
                            [Import("PrismSampleCache", typeof(ICacheManager))] ICacheManager _cacheManager)
    {
        this.View = view;
        this.View.DataContext = this;
    
        _cacheManager.Add("SampleValue", "CacheValue");
        this._text = _cacheManager.GetData("SampleValue").ToString();
        logger.Log("ShellViewModel Created", Category.Info, Priority.None);
    }

    运行结果:
    Image

    小结

    本文用微软企业库实现了一个简单的缓存系统。
    源码下载

    参考信息

    patterns & practices – Enterprise Library
    黄聪:Microsoft Enterprise Library 5.0 系列教程(一) : Caching Application Block (初级)

  • 相关阅读:
    SAP OPEN UI5 Step 8: Translatable Texts
    SAP OPEN UI5 Step7 JSON Model
    SAP OPEN UI5 Step6 Modules
    SAP OPEN UI5 Step5 Controllers
    SAP OPEN UI5 Step4 Xml View
    SAP OPEN UI5 Step3 Controls
    SAP OPEN UI5 Step2 Bootstrap
    SAP OPEN UI5 Step1 环境安装和hello world
    2021php最新composer的使用攻略
    Php使用gzdeflate和ZLIB_ENCODING_DEFLATE结果gzinflate报data error
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5763208.html
Copyright © 2011-2022 走看看