65.9K
CodeProject 正在变化。 阅读更多。
Home

对象装饰 – 编译语言运行时行为的解决方案

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年1月26日

CPOL

2分钟阅读

viewsIcon

15037

讨论为编译语言添加运行时行为

编译语言一直被批评为无法像其对应物——解释型语言那样在运行时添加行为。但这不应该如此。通过对象装饰,可以在编译语言中向对象添加运行时行为。这是一种简单但强大的软件可扩展性方法。它补充了编译语言的基于类的编程,并且优于解释型语言的动态类型。

对象装饰的思考方式

对象装饰意味着将额外的行为附加到对象上。其思想是:你有一个对象,其方法执行定义的行为。现在,你希望在方法执行之前或之后添加一些额外的行为。因此,你通过装饰将额外的行为附加到方法上,以便在运行时调用方法时,附加的行为在之前或之后执行。

一旦你理解了这个概念,装饰本身就非常简单。最基本的是,你需要指定一个对象、对象的方法(们)、额外的行为(们)以及额外行为的位置(之前或之后)。所有这些都通过一个调用完成,如下所示

doAThing = ObjectProxyFactory.CreateProxy2<IDoAnything>(
    doAThing,
    new string[] { "DoThing" },
    new Decoration2(SayHello, null),
    new Decoration2(SayBye, null)
);

在这里,你将对象 doAThing 作为第一个参数指定,然后是其方法 DoThing,预处理(之前)行为 SayHello 和后处理(之后)行为 SayBye。所有这些都表示我想在方法 DoThing 的对象 doAThing 之前添加行为 SayHello,之后添加行为 SayBye。该调用返回原始对象的代理。然后,你可以像使用原始对象一样使用该代理。现在,代码

doAThing.DoThing();

首先执行 SayHello,然后执行实际方法 DoThing,最后执行 SayBye

完整的代码如下所示

using CBOExtender;

namespace HelloWorld
{
    public interface IDoAnything {
        void DoThing();
    }

    public class DoAnything : IDoAnything {
        public void DoThing() { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IDoAnything doAThing = new DoAnything();

            doAThing = ObjectProxyFactory.CreateProxy2<IDoAnything>(
                doAThing,
                new string[] { "DoThing" },
                new Decoration2(SayHello, null),
                new Decoration2(SayBye, null)
            );

            doAThing.DoThing();
        }

        public static void SayHello(AspectContext2 ctx, dynamic parameters)
        {
            System.Console.WriteLine("Hello!");
        }

        public static void SayBye(AspectContext2 ctx, dynamic parameters)
        {
            System.Console.WriteLine("Bye!");
        }
    }
}

更多信息

要下载 CBOExtender,请在 Visual Studio 10 内部使用 NuGet 搜索 CBOExtender,或点击 这里

要了解如何通过装饰将日志记录、安全检查和排序作为额外的运行时行为添加到对象中,请点击 这里

要了解如何通过装饰将事务作为额外的运行时行为添加到对象中,请点击 这里

要了解对象装饰与动态类型之间的区别,请点击 这里

要查看我所有的文章和博客,请点击 这里


© . All rights reserved.