用领域事件模拟AOP注入
欢迎围观KylinORM系列文章:
第一篇:使用Tag网络维护实体关系
第二篇:基于业务驱动的领域服务
第三篇:使用领域事件模拟AOP注入
使用AOP织入领域对象可以方便地实现级联加载、数据校验、缓存、日志等功能,而不必将代码放在领域对象的基类或仓储对象的基类中。
使用AOP动态创建领域对象的Proxy实例,并按需要实现指定的接口。
可惜AOP(.NET)必须在运行时使用IL字节码动态创建类,或者让目标对象继承ContextBoundObject。有没有更简便的方法呢?看这段代码:
|
OrderInfo是一个普通的实体(POCO),在实体中声明一个映射器用于管理OrderInfo和其他实体的关联。然后使用Before拦截器拦截EntityCreate事件,使用AfterReturning拦截器拦截EntityCreate事件。
当对实体执行创建、更新、删除等操作时,数据层会首先检查实体映射器上注册的拦截器,调用相关的响应方法,根据方法的返回值再决定是否要执行真正的操作。
事件的响应Logger.Log可以指定任意数量的重载,事件源应根据实体和操作信息自动匹配最合适的方法。
|
数据映射器可以代理任意对象的任意操作,只需要将操作TargetClass.DO更改为AspjectManager.Invoke(TargetClass.DO)即可。在Invoke之前AspjectManager会检查TargetClass.Mapper上注册的拦截器。
虽然需要在POCO对象中注册一个小小的属性,但是这点代价和动态类型、继承基类比起来就微不足道了。
相关示例和文档请参见 http://www.kylinorm.org/
[该贴被gameboyLV于2012-04-10 23:19修改过]