技术开发 频道

用.NET实现AOP框架


C# 定义外部横切机制
public class LogAttribute : BeforeDecoratorAttribute 
{
public override void Process(object target, MethodBase method, object[] parameters)
{
Trace.WriteLine(method.Name);
}
}

public class ParameterCountAttribute : BeforeDecoratorAttribute
{
public override void Process(object target, MethodBase method, object[] parameters)
{
Trace.WriteLine(target.GetType().Name);
}
}
Unit Test
public interface IBizObject 
{
/// 对对象功能的装饰采用“横切”而非传统的继承方式获得,
/// 中间代理对象的构造是隐式,而且是由DecoratorInjector包装的,
/// 从外部角度看,对象的扩展是在Meta信息部分扩展,而且有关的约
/// 束定义在接口而非实体类层次。
[Log]
[ParameterCount]
int GetValue();
}

public class BizObject : IBizObject
{
public int GetValue() { return 0; }
}

[TestMethod]
public void Test()
{
IBizObject obj = (IBizObject)DecoratorInjector.Create(
new BizObject(), typeof(IBizObject));
int val = obj.GetValue();
Assert.AreEqual<int>(0, val);
}
进一步分析

    通过上面两个示例不难看出虽然通过Remoting的MarshalByReference或System.Reflection.Emit命名空间下的对象可以通过透明代理把装饰类型加载到目标对象上。尤其对于后者,类似有关授权控制、有效性检查等内容都可以在不修改外部业务逻辑的情况下,通过修改在具体业务类型甚至他们接口的层次实施新的控制。

   不过用于实际项目中还有很多欠缺,主要是性能问题,主要因为反射和动态加载所致。在类似Castle等一些更成熟的框架中会更多借助缓冲,把动态创建的代理类实例保存在内存里,同时把动态生成的Assembly保存在文件系统中,借以最大程度的提高执行效率和Assembly重用性。
0
相关文章