回到目录

什么是LindAspects

之前写了关于Aspects的文章《Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP》,今天主要在设计思想上进行刨析一下,对缓存拦截器一直没有实现,所以文章了也一直没有发出来,让大家等这么久实在不好意思。LindAspects主要是面向切面编程AOP的一种实现,就像MVC框架里的Filter,Filter会自己注入到了每个Action执行的各个环节里,而我们可以直接实现自己的Filter即可,例如只要是继承ActionFilter,那么你的Filter在Action执行时就可以被动态执行,这种设计就相当于把整个Action横切开来,注入我们需要的代码,这大概念就是面向切面(方面)编程的真谛吧!

LindAspects原理是什么

主要通过Emit实现对方法的重写,这个方法不向Unity.Interception非要是虚方法,咱们的Emit本质上是建立一个新的类型,然后建立一个新的方法,这个方法里再去执行当前被拦截的方法的主体,然后通过主体方法实现的AspectAttribute来控制是在主体执行前注入还是在主体执行之后注入!

配合LindPlugins实现对象的生产

方法的对象如何生产一直是个问题,传统方法是通过IoC去创建对象,而你使用new去生产对象一定是不行的,因为你的拦截器无法注入到实例上,在Lind环境里,一切组件都应该是“插件(LindPlugins)”,它们的注册和生产也是统一的,都是通过LindPlugins来实现,当前再往底层看,Plugins本身也是通过autofac这个ioc容器实现的,呵呵。

两种生产拦截对象的对比

Aspects本身的工厂生产

    [TestMethod]public void TestMethod1(){ITest test = ProxyFactory.CreateProxy(typeof(ITest), typeof(LoggerAspectAttribute)) as ITest;test.Do();}

LindPlugins的容器生产

     [TestMethod]public void AspectCachingGet(){var old = PluginManager.Resolve<IAopHelloTest2>();var result = old.GetData("zz", 1);Console.WriteLine(result);}

LindAspects设计图

CachingAspectAttribute在介绍

数据缓存这个东西经常被我们提到,现在很多产品都是异步缓存,就是先生成缓存数据,然后在方法里直接从缓存取即可,而今天大叔说的CachingAspectAttribute是指在方法中进行拦截,缓存添加与读取的动作完成由特性拦截器去做,这样做的好处是把业务逻辑与缓存逻辑分开,解耦你的代码!

     /// <summary>/// 有返回值的方法拦截动作/// </summary>/// <param name="context"></param>public override object FuncInvoke(InvokeContext context, MethodInfo methodInfo){var paramList = InitParams(context, methodInfo);var obj = Activator.CreateInstance(methodInfo.ReflectedType);switch (cachingMethod){case CachingMethod.Get:#region 读缓存//redis键名,在put和get时使用var key = prefix + context.Method.MethodName;//hashset键名,参数组合var param = string.Join("_", context.Parameters.Select(i => i.Para));if (!RedisClient.RedisManager.Instance.GetDatabase().KeyExists(key)){var objValue = methodInfo.Invoke(obj, paramList.ToArray());RedisClient.RedisManager.Instance.GetDatabase().HashSet(key, param, Lind.DDD.Utils.SerializeMemoryHelper.SerializeToJson(objValue));return objValue;}var entity = RedisClient.RedisManager.Instance.GetDatabase().HashGet(key, param);return Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<object>(entity.ToString());#endregioncase CachingMethod.Remove:case CachingMethod.Put:#region 缓存失效var putvalue = methodInfo.Invoke(obj, paramList.ToArray());RemoveCache(methodInfo);return putvalue;#endregiondefault:throw new InvalidOperationException("无效的缓存方式。");}}

本缓存特性主要使用redis实现持久化,在key的设计上使用了前缀在方法名及方法参数的规则,存储结构如hashset,在缓存失效上使用了方法的动态触发,我们可以看到,代码中定义了缓存的方式,读,加,移除等,我们可以在具体方法上控制缓存的类型,下面是具体方法的特性注入,代码如下:

  public class AopHello : IAopHelloTest2{#region IHello 成员[CachingAspect(CachingMethod.Get)]public List<DtoUser> GetData(string title, int age){//读取数据的业务代码return new Test_Code_FirstEntities().WebManageUsers.Select(i => new DtoUser{Id = i.ID,Name = i.LoginName}).ToList();}[CachingAspect(CachingMethod.Remove, "GetData")]public void AddData(string title){ //添加数据的业务代码...}#endregion}

从代码中可以看到,业务代码如负责自己的业务,缓存注入只是一个特性标记!这才是大叔希望看到的缓存注入点!

感谢各位的阅读,希望文章给大家一些启发!

回到目录

转载于:https://www.cnblogs.com/lori/p/6203194.html

Lind.DDD.LindAspects方法拦截的介绍相关推荐

  1. Lind.DDD敏捷领域驱动框架~介绍

    最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要参考了微软的DDD大作 ...

  2. Lind.DDD.Caching分布式数据集缓存介绍

    戏说当年 大叔原创的分布式数据集缓存在之前的企业级框架里介绍过,大家可以关注<我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器>,而今天主要对Lind.DDD.Caching进行更全 ...

  3. Lind.DDD.Messaging框架通讯组件介绍

    大 家好,今天有时间来介绍一下Lind.DDD框架里的消息机制,消息发送这块一般的实现方法是将Email,SMS等集成到一个公用类库里,而本身 Email和SMS没什么关系,它们也不会有什么接口约定, ...

  4. Lind.DDD.UoW~方法回调完成原子化操作

    回到目录 本文来自于实践中的不足 在最近开始过程中,遇到了一个问题,之前设计的工作单元UoW只支持Insert,Update,Delete三种操作,即开发人员可以将以上三种操作同时扔进工作单元,由工作 ...

  5. Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP

    .Net MVC之所以发展的如些之好,一个很重要原因就是它公开了一组AOP的过滤器,即使用这些过滤器可以方便的拦截controller里的action,并注入我们自己的代码逻辑,向全局的异常记录,用户 ...

  6. Lind.DDD.Domain领域模型介绍

    Lind.DDD.Domain位于Lind.DDD核心项目中,它主要面向领域实体而设计,由一个IEntity的标识接口,EntityBase基类和N个Entity实体类组成,其中IEntity主要用来 ...

  7. Lind.DDD.Events领域事件介绍

    闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托,哪个是事 ...

  8. Lind.DDD.Paging分页模块介绍

    分页组件网上有很多,MVC.Pager,JSPager等,通过实现方式大体分为前端分页和后端分页,前端分页是前台对list内存本地集合进行分页,缺点就是在大数据情况下,内存占用过高:后端分页就是UI把 ...

  9. Lind.DDD.Repositories.Mongo层介绍

    之前已经发生了 大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoSql,它的 ...

最新文章

  1. 让DB2数据库更牢靠
  2. boost::mpl模块实现range_c相关的测试程序
  3. 常见笔试面试问题点(转载)
  4. python中seek(10、1)_Python中index()和seek()的用法(详解)
  5. PHP下SESSION无法跨页传递的解决
  6. 机器学习数据预处理之字符串转数字
  7. html怎么制作图片按钮效果,如何制作一个漂亮的 CSS 按钮
  8. 韩立刚计算机网络笔记-第01章 计算机网络详解
  9. linux用屏幕录制软件有哪些,Linux系统下推荐使用的5个屏幕录像软件是什么?
  10. hdu 6080 度度熊保护村庄(floydS使用技巧)
  11. RAID10磁盘阵列损坏修复操作
  12. 计算机系统的还原及备份,win7系统备份与还原功能怎么用?win7系统使用备份与还原功能的方法...
  13. 深入理解Plasma(四)Plasma Cash
  14. 编译内核报错——*** 没有规则可制作目标“debian/canonical-revoked-certs.pem”,由“certs/x509_revocation_list” 需求。 停止。
  15. Python实现文件前添加序号
  16. Flume从入门实战到精通再到面试一文搞定
  17. FCC KDB 680106 无线充电(WPT)更新解读
  18. Internet/Custom路由配置——网络测试仪实操
  19. 【表格样式】——HTML制作表格大全
  20. GDI泄漏问题:QWindowsBackingStore::flush:GetDC failed

热门文章

  1. UESTC人工智能 期末复习
  2. 如何入侵目标的网络DIY指南
  3. 参考文档:《基于多目标算法的冷热电联供型综合能源系统运行优化》 多目标粒子群 冷热电联供 综合能源系统 运行优化
  4. java字符乱码问题_怎么解决java中的字符乱码问题
  5. 在PhotoShop中修正相机图片将梯形变成长方形
  6. eclipse看不到android设备,为什么Eclipse的Android设备选择器没有显示我的Android设备?...
  7. 线上宠物店一体化服务小程序设计与开发
  8. 怎么看待SEO?新型SEO与传统SEO对比优势?
  9. css3 html5动画特效
  10. 计算机考研二战有必要吗,2019计算机考研二战的小伙伴要调整注重的几点