技术开发 频道

SqlCenter中的AOP实现


【IT168技术文档】

  验证组件,为了实现对类属性等的约束和判断的轻量级组件. 比如Filed实体中Name不能为空这个约束.对这个约束的判断就可以通过我们的验证组件实现.

  如果Field属性Name不能为空这个约束,用常规方法实现,则如下:
public string Name { get{return _name;}; set { if(value!=null)_name=value; else _name =" "; }; }
  这里还是一个最为简单的约束.如果更加复杂呢?同时同种约束的实体很多呢?我们的代码就需要不断的重复.有没有点小孩尿布的味道了? 是的, 我们应该有更好的方案!
  这个时候,AOP的作用派上了用场.本文假设你对AOP基础理论和对以下知识都有了解:元数据、Attribute、.Net Remoting的代理技术. 


  下面就我能理解的 "基于AOP的验证组件" 做点分析:)

  先看看实现了AOP验证的代码是什么样子的:
[AspectAttribute] public class Field : ContextBoundObject { public string Name { get{return _name;} [NotNull] set{_name = value;} /**//*假设我们还需要他不能为"Randy" [NotNull,NotRandy] set{_name=value;} */ } }
  是不是非常优雅?代码非常清晰,琐碎的约束性判断代码一点都没有,也就一点没有影响核心关注了:)

  SqlCenter中的AOP是基于.Net Remoting 代理实现的.

  上面代码告诉我们,需要自定义了一个ProxyAttribute,命名为AspectAttribute:
[AttributeUsage(AttributeTargets.Class)] public sealed class AspectAttribute : ProxyAttribute { public override MarshalByRefObject CreateInstance(Type serverType) { MarshalByRefObject rawInstance = base.CreateInstance(serverType); RealProxy rp = new AspectProxy(serverType, rawInstance); return (MarshalByRefObject) rp.GetTransparentProxy(); } }
0
相关文章