zoukankan      html  css  js  c++  java
  • Prism6下的MEF:基于微软企业库的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 (初级)

  • 相关阅读:
    appcan双击返回退出系统
    实现两个矩阵相乘的C语言程序
    编写简单的windows桌面计算器程序
    使用C++实现图形的旋转、缩放、平移
    使用MFC创建C++程序
    SQL server2017的操作(练习题)
    使用SQL语句在SQL server2017上创建数据库
    使用交互式方式在SQL server2017上创建数据库
    解决VS2017编译后的EXE文件不能在其他电脑上运行的问题
    傅里叶分析之掐死教程(完整版)更新于2014.06.06----转载
  • 原文地址:https://www.cnblogs.com/youngytj/p/5755281.html
Copyright © 2011-2022 走看看