回到目录

AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独立的部分,我们很早之前叫它部件,在SOA里,它叫做服务,而我认为叫它模块更加贴切,确实,这些与领域无关的东西,是像是一个个的功能模块。

之前讲过一个日志组件,有兴趣的同学可以查看:第一回 日志记录组件

今天主要说一下缓存组件,就是缓存模块,这些模块可以很方便的为每个方法添加缓存机制,事实上是在方法体执行之前,进行缓存对象的检索,当检索到有缓存,就直接加载缓存对象了,这对于数据高并发情况下,尤其有用,呵呵。

实现缓存的武器:Microsoft.Practices.EnterpriseLibrary.Caching

辅助兵器(IOC):Microsoft.Practices.Unity

实现的效果:根据在配置文件中对要缓存的部分进行配置后,使它减少对数据库的交互,提高程序的相应能力

下面开始我们的Caching之旅

1 使用nuget添加caching和Unity组件,添加好了之后在引用中自己出现

aaarticlea/png;base64,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" alt="" />

在package.config中有我们的组件的相关说明

<packages>
<package id="Unity" version="3.0.1304.0" targetFramework="net45" />
<package id="Unity.Interception" version="3.0.1304.0" targetFramework="net45" />
<package id="EnterpriseLibrary.Caching" version="5.0.505.0" targetFramework="net45" />
<package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net45" />
<package id="CommonServiceLocator" version="1.0" targetFramework="net45" />
</packages>

2 在web.config添加相应的unity注入信息和拦截信息的配置

<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />
<container>
<extension type="Interception" />
<register type="Infrastructure.Caching.ICacheProvider, DDD_AOP_WCF" mapTo="Infrastructure.Caching.EntLibCacheProvider, DDD_AOP_WCF" />
<!--Repository Context & Repositories--> <register type="DDD_AOP_WCF.Repository.IProductRepository, DDD_AOP_WCF" mapTo="DDD_AOP_WCF.Repository.ProductRepository, DDD_AOP_WCF">
<!-- <interceptor type="VirtualMethodInterceptor" />-->
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior type="Infrastructure.InterceptionBehaviors.CachingBehavior,DDD_AOP_WCF" />
<interceptionBehavior type="Infrastructure.InterceptionBehaviors.ExceptionLoggingBehavior, DDD_AOP_WCF" />
</register>
</container>
</unity>

下面是缓存组件的配置:

  <!--BEGIN: Caching-->
<cachingConfiguration defaultCacheManager="ByteartRetailCacheManager">
<cacheManagers>
<add name="ByteartRetailCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
expirationPollFrequencyInSeconds="" maximumElementsInCacheBeforeScavenging=""
numberToRemoveWhenScavenging="" backingStoreName="NullBackingStore" />
</cacheManagers>
<backingStores>
<add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="NullBackingStore" />
</backingStores>
</cachingConfiguration>
<!--END: Caching-->

3 建立一个测试用的IRepository接口和一个个性化操作的接口IProductRepository

  public interface IRepository<TEntity> where TEntity : class
{
void Insert(TEntity entity);
string Hello();
IQueryable<TEntity> GetEntities();
}
  public interface IProductRepository : IRepository<Product>
{
/// <summary>
/// 获取产品列表
/// </summary>
/// <returns></returns>
[Caching(CachingMethod.Get)]
List<Product> GetProduct(); /// <summary>
/// 建立产品
/// </summary>
[Caching(CachingMethod.Remove, "GetProduct")]
void AddProduct(Product entity); /// <summary>
/// 修改产品
/// </summary>
[Caching(CachingMethod.Remove, "GetProduct")]
void ModifyProduct(Product entity); }

对这个接口进行实现,当然,它可以有多个实现版本,这也是IoC出现的原因

aaarticlea/png;base64,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" alt="" />

4 建立一个本地服务器,它是与IoC实现松耦合的前提,而IoC是我们实现程序代码松耦合的前提,呵呵。

  /// <summary>
/// Represents the Service Locator.
/// </summary>
public sealed class ServiceLocator : IServiceProvider
{
#region Private Fields
private readonly IUnityContainer container;
#endregion #region Private Static Fields
private static readonly ServiceLocator instance = new ServiceLocator();
#endregion #region Ctor
/// <summary>
/// Initializes a new instance of ServiceLocator class.
/// </summary>
private ServiceLocator()
{
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
container = new UnityContainer();
section.Configure(container);
}
#endregion #region Public Static Properties
/// <summary>
/// Gets the singleton instance of the ServiceLocator class.
/// </summary>
public static ServiceLocator Instance
{
get { return instance; }
}
#endregion #region Private Methods
private IEnumerable<ParameterOverride> GetParameterOverrides(object overridedArguments)
{
List<ParameterOverride> overrides = new List<ParameterOverride>();
Type argumentsType = overridedArguments.GetType();
argumentsType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.ToList()
.ForEach(property =>
{
var propertyValue = property.GetValue(overridedArguments, null);
var propertyName = property.Name;
overrides.Add(new ParameterOverride(propertyName, propertyValue));
});
return overrides;
}
#endregion #region Public Methods
/// <summary>
/// Gets the service instance with the given type.
/// </summary>
/// <typeparam name="T">The type of the service.</typeparam>
/// <returns>The service instance.</returns>
public T GetService<T>()
{
return container.Resolve<T>();
}
/// <summary>
/// Gets the service instance with the given type by using the overrided arguments.
/// </summary>
/// <typeparam name="T">The type of the service.</typeparam>
/// <param name="overridedArguments">The overrided arguments.</param>
/// <returns>The service instance.</returns>
public T GetService<T>(object overridedArguments)
{
var overrides = GetParameterOverrides(overridedArguments);
return container.Resolve<T>(overrides.ToArray());
}
/// <summary>
/// Gets the service instance with the given type by using the overrided arguments.
/// </summary>
/// <param name="serviceType">The type of the service.</param>
/// <param name="overridedArguments">The overrided arguments.</param>
/// <returns>The service instance.</returns>
public object GetService(Type serviceType, object overridedArguments)
{
var overrides = GetParameterOverrides(overridedArguments);
return container.Resolve(serviceType, overrides.ToArray());
}
#endregion #region IServiceProvider Members
/// <summary>
/// Gets the service instance with the given type.
/// </summary>
/// <param name="serviceType">The type of the service.</param>
/// <returns>The service instance.</returns>
public object GetService(Type serviceType)
{
return container.Resolve(serviceType);
} #endregion
}

5 建立一个缓存拦截器,它是与具体领域没有关系的,我们的拦截器Interception,可以有两个,如缓存拦截,日志拦截,异常拦截等等,我会在后面的文章中进

行介绍

  /// <summary>
/// 表示用于方法缓存功能的拦截行为。
/// </summary>
public class CachingBehavior : IInterceptionBehavior
{
#region Private Methods
/// <summary>
/// 根据指定的<see cref="CachingAttribute"/>以及<see cref="IMethodInvocation"/>实例,
/// 获取与某一特定参数值相关的键名。
/// </summary>
/// <param name="cachingAttribute"><see cref="CachingAttribute"/>实例。</param>
/// <param name="input"><see cref="IMethodInvocation"/>实例。</param>
/// <returns>与某一特定参数值相关的键名。</returns>
private string GetValueKey(CachingAttribute cachingAttribute, IMethodInvocation input)
{
switch (cachingAttribute.Method)
{
// 如果是Remove,则不存在特定值键名,所有的以该方法名称相关的缓存都需要清除
case CachingMethod.Remove:
return null;
// 如果是Get或者Put,则需要产生一个针对特定参数值的键名
case CachingMethod.Get:
case CachingMethod.Put:
if (input.Arguments != null &&
input.Arguments.Count > )
{
var sb = new StringBuilder();
for (int i = ; i < input.Arguments.Count; i++)
{
sb.Append(input.Arguments[i].ToString());
if (i != input.Arguments.Count - )
sb.Append("_");
}
return sb.ToString();
}
else
return "NULL";
default:
throw new InvalidOperationException("无效的缓存方式。");
}
}
#endregion #region IInterceptionBehavior Members
/// <summary>
/// 获取当前行为需要拦截的对象类型接口。
/// </summary>
/// <returns>所有需要拦截的对象类型接口。</returns>
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
} /// <summary>
/// 通过实现此方法来拦截调用并执行所需的拦截行为。
/// </summary>
/// <param name="input">调用拦截目标时的输入信息。</param>
/// <param name="getNext">通过行为链来获取下一个拦截行为的委托。</param>
/// <returns>从拦截目标获得的返回信息。</returns>
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
var method = input.MethodBase;
var key = method.Name;
if (method.IsDefined(typeof(CachingAttribute), false))
{
var cachingAttribute = (CachingAttribute)method.GetCustomAttributes(typeof(CachingAttribute), false)[];
var valKey = GetValueKey(cachingAttribute, input);
switch (cachingAttribute.Method)
{
case CachingMethod.Get:
try
{
if (CacheManager.Instance.Exists(key, valKey))
{
var obj = CacheManager.Instance.Get(key, valKey);
var arguments = new object[input.Arguments.Count];
input.Arguments.CopyTo(arguments, );
return new VirtualMethodReturn(input, obj, arguments);
}
else
{
var methodReturn = getNext().Invoke(input, getNext);
CacheManager.Instance.Add(key, valKey, methodReturn.ReturnValue);
return methodReturn;
}
}
catch (Exception ex)
{
return new VirtualMethodReturn(input, ex);
}
case CachingMethod.Put:
try
{
var methodReturn = getNext().Invoke(input, getNext);
if (CacheManager.Instance.Exists(key))
{
if (cachingAttribute.Force)
{
CacheManager.Instance.Remove(key);
CacheManager.Instance.Add(key, valKey, methodReturn.ReturnValue);
}
else
CacheManager.Instance.Put(key, valKey, methodReturn.ReturnValue);
}
else
CacheManager.Instance.Add(key, valKey, methodReturn.ReturnValue);
return methodReturn;
}
catch (Exception ex)
{
return new VirtualMethodReturn(input, ex);
}
case CachingMethod.Remove:
try
{
var removeKeys = cachingAttribute.CorrespondingMethodNames;
foreach (var removeKey in removeKeys)
{
if (CacheManager.Instance.Exists(removeKey))
CacheManager.Instance.Remove(removeKey);
}
var methodReturn = getNext().Invoke(input, getNext);
return methodReturn;
}
catch (Exception ex)
{
return new VirtualMethodReturn(input, ex);
}
default: break;
}
} return getNext().Invoke(input, getNext);
} /// <summary>
/// 获取一个<see cref="Boolean"/>值,该值表示当前拦截行为被调用时,是否真的需要执行
/// 某些操作。
/// </summary>
public bool WillExecute
{
get { return true; }
} #endregion
}

6 下面是前台程序的调用方法

   IProductRepository productRepository = ServiceLocator.Instance.GetService<IProductRepository>();
ViewBag.Product = productRepository.GetProduct();
@{var Model = ViewBag.Product as List<学习陈晴阳的DDD_AOP_WCF.Product>; }
@if (Model != null && Model.Count > )
{
foreach (var item in Model)
{
<p>@item.ProductName</p>
}
}

好了,当我们为程序加上缓存拦截器之后,当它的数据没有发生变化时,会直接从缓存中读取对象,而不会与数据库发生访问!

回到目录

我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器的更多相关文章

  1. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  2. 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器

    回到目录 之前说过有关拦截器的文章,第二回  缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...

  3. 我心中的核心组件(可插拔的AOP)~第五回 消息组件

    回到目录 之所以把发消息拿出来,完全是因为微软的orchard项目,在这个项目里,将公用的与领域无关的功能模块进行抽象,形成了一个个的组件,这些组件通过引用和注入的方式进行工作,感觉对于应用程序的扩展 ...

  4. 我心中的核心组件(可插拔的AOP)~第六回 消息组件~续

    回到目录 上一回写消息组件已经是很久之前的事了,这一次准备把消息组件后续的东西说一下,事实上,第一篇文章主要讲的是发消息,而这一讲最要讲的是收消息,简单的说,就是消息到了服务器之后,如何从服务器实时的 ...

  5. 我心中的核心组件(可插拔的AOP)~调度组件quartz.net

    回到目录 quartz.net是一个任务调度组件,它可以灵活的设置你的调试方式,按时间,按日期,按周期都可以很容易的实现,quartz不仅可以用在web中,而且还可以部署在winform,winser ...

  6. 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity

    回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...

  7. 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception

    回到目录 说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的 ...

  8. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  9. 我心中的核心组件(可插拔的AOP)~调度组件quartz.net续~任务管理器的开发

    回到目录 对于任务调度来说,越来越多的团队选择了quartz,它在java和.net环境下表现都十分优秀,配置简单,功能强大,时间表达式配置灵活,但在使用时,还是感觉缺点什么,怎么说,你在服务器上安装 ...

随机推荐

  1. Json数据中的特殊字符处理

    今天在项目中遇到一个问题,页面上的数据突然显示不出来了,查验后得知是Json数据出现了问题.使用JSON从后台向前台传输数据的时候,当数据本身含有一些特殊字符,会导致JSON数据的解析出错.如果内容中 ...

  2. C++单元测试 之 gtest -- 组合数计算.

    本文将介绍如何使用gtest进行单元测试. gtest是google单元测试框架.使用非常方便. 首先,下载gtest (有些google项目包含gtest,如 protobuf),复制目录即可使用. ...

  3. ContentProvider要点复习

    ContentProvider要点复习 ContentProvider作为四大组件之一,发挥着举足轻重的作用.与之相关联的另外两个类分别是ContentResolver和ContentObserver ...

  4. X86上搭建交叉工具链,来给龙芯笔记本编译本地工具链(未完待续)

    故事的背景是,我买了一台龙芯2F的笔记本来装B. 为什么说是装B呢?因为不但操作系统是Linux,而且CPU还是龙芯的. 一般人有这么酷的装备吗?简直是装B大圣啊. 这里一定要申明一点,本人不是IT技 ...

  5. 轻松创建R语言函数包

    讲真,用R这么几年,始终未尝试过写自己的包,看来这就是我与真正程序员的差距了——编程习惯等于没有. 昨天一个偶然的机会想开始写自己的工具包,发现了前期教程的有一些过时.于是,写一个**windows* ...

  6. Catia CAA 二次开发 ---- 开发准备(0)

    去年开始学习Catia CAA的二次开发,前后的间断性学习有1年吧. 现在已经好久没用,忘得也差不多了,原来的笔记都放在了Evernote,现在还是觉得边继续复习边总结一下,以后也比较好检索. 先吐槽 ...

  7. JS变量和函数的一些理解

    今日看了下JS变量的一些文章,有些感触,把自己总结的一些写出来. JS初始化的过程1.JS解释器执行代码之前,创建全局变量2.用预定义的值和函数来初始化全局对象中的属性,3.搜索函数外的var声明,创 ...

  8. windows IIS6 PHP搭建

    windows下搭建PHP环境有很多种方法.传说,FastCGI下运行PHP  是 兼顾安全和效率的一种.传说.传说.下面讲解在windows server2003 IIS6中安装 PHP 以下文字, ...

  9. jackson报错 无法解析,但是json一切正常

    因为类里面缺少无参构造(被有参构造盖掉了)

  10. XAF How to show custom forms and controls in XAF (Example)

    XAF How to show custom forms and controls in XAF (Example) https://www.devexpress.com/Support/Center ...