Castle.DynamicProxy的使用

 

.Net平台AOP技术研究

简单实现

通过继承实现

public interface ICoding
{
    void DoSth();
}
public class Coding : ICoding
{
    public virtual void DoSth()
    {
        Console.WriteLine("敲代码咯!");
    }
}
public class ProjectDevelopment : Coding, ICoding
{
    public override void DoSth()
    {
        before();
        base.DoSth();
        after();
    }

    private void before()
    {
        Console.WriteLine("需求分析!");
    }
    private void after()
    {
        Console.WriteLine("测试!");
    }
}

  

装饰者(由继承改作组合)

public interface ICoding
{
    void DoSth();
}
public class Coding : ICoding
{
    public virtual void DoSth()
    {
        Console.WriteLine("敲代码咯!");
    }
}
public class ProjectDevelopment : ICoding
{
    private ICoding coding;
    public ProjectDevelopment(ICoding coding)
    {
        this.coding = coding;
    }
    public void DoSth()
    {
        before();
        coding.DoSth();
        after();
    }

    private void before()
    {
        Console.WriteLine("需求分析!");
    }
    private void after()
    {
        Console.WriteLine("测试!");
    }
}

  

ASP.NET MVC中的拦截器

public interface IAdditionalOp
{
    void before();
    void after();
}
public class AdditionalOp : Attribute, IAdditionalOp
{
    public void before()
    {
        Console.WriteLine("需求分析!");
    }
    public void after()
    {
        Console.WriteLine("测试!");
    }
}

public class Coding
{
    [AdditionalOp]
    public void DoSth()
    {
        Console.WriteLine("敲代码咯!");
    }
}

public class ProjectDevelopment
{
    public void Development()
    {
        var classUnder = typeof(Coding);
        var allMethods = classUnder.GetMethods();
        var methodUnder = allMethods.Where(m => m.Name == "DoSth");

        foreach (MethodInfo methodInfo in methodUnder)
        {
            Attribute[] attributes = Attribute.GetCustomAttributes(methodInfo, typeof(AdditionalOp));
            foreach (var item in attributes)
            {
                (item as AdditionalOp).before();
            }

            Coding coding = new Coding();
            coding.DoSth();

            foreach (var item in attributes)
            {
                (item as AdditionalOp).after();
            }
        }
    }
}

  

动态代理

动态代理,就是在运行时动态地产生代理类,进而产生代理对象。

项目中导入Castle.Core程序包

5种动态代理的生成模式

public interface ICoding
{
    void DoSth();
}
public class Coding : ICoding
{
    public virtual void DoSth()
    {
        Console.WriteLine("敲代码咯!");
    }
}
public class Architecture : Coding
{
    public override void DoSth()
    {
        Console.WriteLine("架构设计!");
        base.DoSth();
    }
}
public class MyInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        before();
        if (invocation.InvocationTarget != null)
        {
            invocation.Proceed();
        }
        after();
    }

    private void before()
    {
        Console.WriteLine("需求分析!");
    }
    private void after()
    {
        Console.WriteLine("测试!");
    }
}

public class MyInterceptor2 : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        before();
        if (invocation.InvocationTarget != null)
        {
            invocation.Proceed();
        }
        after();
    }

    private void before()
    {
        Console.WriteLine("需求分析2!");
    }
    private void after()
    {
        Console.WriteLine("测试2!");
    }
}
public interface IAddItem
{
    void AddItem();
}

public class AnotherItem : IAddItem
{
    public void AddItem()
    {
        Console.WriteLine("另一个项目开始了!");
    }
}

  

class Program
{
    static void Main(string[] args)
    {
        ClassProxy();
        ClassProxyWithTarget();
        InterfaceProxyWithoutTarget();
        InterfaceProxyWithTarget();
        InterfaceProxyWithTargetInterface();
        Mixin();
        Mixin2();
        Mixin3();
        Mixin4();
        Mixin5();
        Console.ReadKey();
    }

    static void ClassProxy()
    {
        Console.WriteLine("\n*************ClassProxy*************\n");
        var generator = new ProxyGenerator();
        var ProjectDevelopment = generator.CreateClassProxy<Coding>(
            new MyInterceptor(),
            new MyInterceptor2()
            );
        ProjectDevelopment.DoSth();

        Print(ProjectDevelopment);
    }

    static void ClassProxyWithTarget()
    {
        Console.WriteLine("\n*************ClassProxyWithTarget*************\n");
        var generator = new ProxyGenerator();
        var ProjectDevelopment = generator.CreateClassProxyWithTarget<Coding>(
            new Architecture(),
            new MyInterceptor(),
            new MyInterceptor2()
            );
        ProjectDevelopment.DoSth();

        Print(ProjectDevelopment);
    }

    static void InterfaceProxyWithoutTarget()
    {
        Console.WriteLine("\n*************InterfaceProxyWithoutTarget*************\n");
        var generator = new ProxyGenerator();
        var ProjectDevelopment = generator.CreateInterfaceProxyWithoutTarget<ICoding>(
            new MyInterceptor(),
            new MyInterceptor2()
            );
        ProjectDevelopment.DoSth();

        Print(ProjectDevelopment);
    }

    static void InterfaceProxyWithTarget()
    {
        Console.WriteLine("\n*************InterfaceProxyWithTarget*************\n");
        var generator = new ProxyGenerator();
        var ProjectDevelopment = generator.CreateInterfaceProxyWithTarget<ICoding>(
            new Architecture(),
            new MyInterceptor(),
            new MyInterceptor2()
            );
        ProjectDevelopment.DoSth();

        Print(ProjectDevelopment);
    }

    static void InterfaceProxyWithTargetInterface()
    {
        Console.WriteLine("\n*************InterfaceProxyWithTargetInterface*************\n");
        var generator = new ProxyGenerator();
        var ProjectDevelopment = generator.CreateInterfaceProxyWithTargetInterface<ICoding>(
            new Architecture(),
            new MyInterceptor(),
            new MyInterceptor2()
            );
        ProjectDevelopment.DoSth();

        Print(ProjectDevelopment);
    }
    static void Print(object o)
    {
        Console.WriteLine();
        Console.WriteLine("GetType():".PadRight(30) + o.GetType());
        Console.WriteLine("GetType().BaseType:".PadRight(30) + o.GetType().BaseType);

        var compositeField = o.GetType().GetField("__target");
        Console.WriteLine("__target:".PadRight(30) + compositeField?.FieldType + ", " + compositeField?.Name);

        foreach (var interfaceType in o.GetType().GetInterfaces())
        {
            Console.WriteLine("GetType().GetInterfaces():".PadRight(30) + interfaceType);
        }

        foreach (var a in (o as IProxyTargetAccessor).GetInterceptors())
        {
            Console.WriteLine("GetInterceptors():".PadRight(30) + a);
        }
    }

    static void Print2(object o)
    {
        Console.WriteLine();
        Console.WriteLine("GetType():".PadRight(30) + o.GetType());
        Console.WriteLine("GetType().BaseType:".PadRight(30) + o.GetType().BaseType);

        var compositeField = o.GetType().GetField("__target");
        Console.WriteLine("__target:".PadRight(30) + compositeField?.FieldType + ", " + compositeField?.Name);

        foreach (var field in o.GetType().GetFields())
        {
            if (field.Name.StartsWith("__mixin"))
            {
                Console.WriteLine("GetType().GetFields():".PadRight(30) + field?.FieldType + ", " + field?.Name);
            }
        }

        foreach (var interfaceType in o.GetType().GetInterfaces())
        {
            Console.WriteLine("GetType().GetInterfaces():".PadRight(30) + interfaceType);
        }

        foreach (var a in (o as IProxyTargetAccessor).GetInterceptors())
        {
            Console.WriteLine("GetInterceptors():".PadRight(30) + a);
        }
    }

    static void Mixin()
    {
        Console.WriteLine("\n*************CreateClassProxy Mixin*************\n");
        var generator = new ProxyGenerator();
        var options = new ProxyGenerationOptions();
        options.AddMixinInstance(new AnotherItem());

        var ProjectDevelopment = generator.CreateClassProxy<Coding>(
            options,
            new MyInterceptor(),
            new MyInterceptor2()
            );
        ProjectDevelopment.DoSth();
        Console.WriteLine("\n");
        (ProjectDevelopment as IAddItem).AddItem();

        Print2(ProjectDevelopment);
    }

    static void Mixin2()
    {
        Console.WriteLine("\n*************CreateClassProxyWithTarget Mixin*************\n");
        var generator = new ProxyGenerator();
        var options = new ProxyGenerationOptions();
        options.AddMixinInstance(new AnotherItem());

        var ProjectDevelopment = generator.CreateClassProxyWithTarget<Coding>(
            new Architecture(),
            options,
            new MyInterceptor(),
            new MyInterceptor2()
            );

        ProjectDevelopment.DoSth();
        Console.WriteLine("\n");
        (ProjectDevelopment as IAddItem).AddItem();

        Print2(ProjectDevelopment);
    }

    static void Mixin3()
    {
        Console.WriteLine("\n*************CreateInterfaceProxyWithoutTarget Mixin*************\n");
        var generator = new ProxyGenerator();
        var options = new ProxyGenerationOptions();
        options.AddMixinInstance(new AnotherItem());

        var ProjectDevelopment = generator.CreateInterfaceProxyWithoutTarget<ICoding>(
            options,
            new MyInterceptor(),
            new MyInterceptor2()
            );

        ProjectDevelopment.DoSth();
        Console.WriteLine("\n");
        (ProjectDevelopment as IAddItem).AddItem();

        Print2(ProjectDevelopment);
    }

    static void Mixin4()
    {
        Console.WriteLine("\n*************CreateClassProxyWithTarget Mixin*************\n");
        var generator = new ProxyGenerator();
        var options = new ProxyGenerationOptions();
        options.AddMixinInstance(new AnotherItem());

        var ProjectDevelopment = generator.CreateClassProxyWithTarget<Coding>(
            new Architecture(),
            options,
            new MyInterceptor(),
            new MyInterceptor2()
            );

        ProjectDevelopment.DoSth();
        Console.WriteLine("\n");
        (ProjectDevelopment as IAddItem).AddItem();

        Print2(ProjectDevelopment);
    }

    static void Mixin5()
    {
        Console.WriteLine("\n*************CreateInterfaceProxyWithTargetInterface Mixin*************\n");
        var generator = new ProxyGenerator();
        var options = new ProxyGenerationOptions();
        options.AddMixinInstance(new AnotherItem());

        var ProjectDevelopment = generator.CreateInterfaceProxyWithTargetInterface<ICoding>(
            new Architecture(),
            options,
            new MyInterceptor(),
            new MyInterceptor2()
            );

        ProjectDevelopment.DoSth();
        Console.WriteLine("\n");
        (ProjectDevelopment as IAddItem).AddItem();

        Print2(ProjectDevelopment);
    }
}

 

 

 

  

 

posted @ 2016-08-20 01:23  随心~  阅读(486)  评论(0)    收藏  举报