返回首页

介绍
{A}(CBO的扩展)是一个对象,可扩展的框架。它是一种通用的功能,增加附加在运行时对象的接口方法的行为对象的工具。
。NET 4中的动态类型的简化行为的定义使得编程CBO的扩展更加灵活。在这篇文章中,我将讨论如何在动态类型在C#中用于定义行为,并将它们添加到CBO的扩展对象。背景
CBO的扩展增加了功能,在运行时的对象,不涉及组件的设计变更。与CBO的扩展,您可以定义一个方面的方法集来表示根据您的公司或系统要求的行为。然后,您可以附加在您的应用程序需要的对象的方法。应用程序开发和维护变得更加容易把个别方法的关注和应用它们在运行时的对象。有一些文章讨论如何添加像记录,安全检查,排序,和交易的管理,使用CBO的扩展的应用程序的功能。请参阅应用程序随着基于组件对象扩展和细节{A2}的发展。
NET 4支持{A3}类型,从而使操作绕过编译时类型检查并在运行时得到解决。由于CBO的Extender是一个对象的可扩展的运行时工具,使用动态类型可以显着简化编程,使方面的方法更加灵活和强大。1.2
CBOExtender的"动态类型和引入方面的方法可以作为NuGet包下载。您也可以下载源代码,最新更新,在{A4纸}更多的例子。
CBOExtender若要从Visual Studio 2010安装到您的项目,点击工具-GT;图书馆软件包管理器-GT;管理NuGet软件包...打开管理NuGet软件包对话。所示类型CBOExtender。
{S0的}
你可能需要{A5的}为Visual Studio 2010才可以下载包。
下面的讨论假定您已经阅读上述条款,按照链接和CBO的扩展尝试什么问题,有一个基本的了解解决和如何解决这些问题。使用代码
在下面的章节中,我将讨论如何界定方面的方法与动态类型。然后,我提出了两种不同的方法为对象方面。这两种方法是:使用CreateProxy2,ChainAspect2使用。大部分代码是从下载的示例应用程序。定义看点
首先,动态类型定义的一个方面方法简单得多。下面的例子定义了一个方面的方法加入不使用动态类型的交易命令。

public static void JoinSqlTransaction(AspectContext ctx, object[] parameters)

{

    try

    {

        if (parameters != null && parameters[0] is IDbTransaction)

        {

            (ctx.Target as ISqlOperation).Command.Transaction = 

                        parameters[0] as SqlTransaction;

            return;

        }

    }

    catch (Exception ex)

    {

        throw new Exception("Failed to join transaction!", ex);

    }

}

使用动态类型,改写如下方面的方法。这两个参数和目标是动态类型。{C}
正如你所看到的,运行时类型检查代码不再需要。在应用程序中调用该方法时,类型在运行时解决。之间AspectContext2和AspectContext的区别是,AspectContext2都有一个目标动态类型而AspectContext有一个目标对象类型。
此外,动态类型的方法并不限于参数的SqlTransaction和目标作为ISqlOperation。任何类型的对象,可以通过参数和目标可以引用任何类型的对象,只要作为执行类型声明ctx.Target.Command.Transaction =参数;工作,当它被执行。例如,你可致电这OracleTransaction对象与目标传递参数的方法,在您的应用程序中的某处假定您已经定义OracleTransaction和IOracleOperation和实施作为IOracleOperation目标的类型正确,以便运行时可以解决的类型和执行的声明ctx.Target.Command.Transaction =参数;
相应的委托方面的方法与动态类型是DecorationDelegate2,它的定义如下: {体C3}
任何与委托定义的签名方法可以封装在委托的一个实例。使用CreateProxy2
CreateProxy2的ObjectProxyFactory类的方法可以被用来关联方面的一个对象,并具有以下签名:{的C4}
Decoration2封装的DecorationDelegate2对象和动态对象,并具有以下签名的构造函数:{C5的}
下面的代码显示,如何CreateProxy2用于添加对象O连接交易方面。{5233}
o是目标对象,其类型应该实现接口IOrder。目标类型也应该实现一个接口ISqlOperation以确保的JoinSqlTransaction并不会抛出运行时异常。第二个参数表示的方法的目标InsertOrder的,应在其余的参数(preAspect指定的方面 - 预处理装饰装潢,postAspect - 后处理装修)。预处理装饰由一个委托对象JoinSqlTransaction方法和动态类型的对象交易。这种情况下,被指定为无后处理装修。
,基本上奠定了上面的代码中添加命令在运行时关联交易的目标之前调用的逻辑的OBJETØInsertOrder方法。使用ChainAspect2
如果使用某种IoC容器,你可能想使用AOPContainer ChainAspect2方法联想方面的一个对象。 ChainAspect2具有以下签名:{C7-}
下面的代码显示,如何ChainAspect2用于添加连接交易方面的对象o。{C8的}结论
此外CBO的扩展,基于组件的文章提出的利益对象扩展,延伸与动态类型相结合,使CBO的扩展更容易,更灵活的对象。
注:本文仅显示了如何使用动态类型定义方面方面是如何添加到对象。您可能需要下载源代码了解他们如何适应在应用程序上下文。源代码重写的例子在文章交易管理基于组件的对象使用动态类型的扩展。

回答

评论会员: 时间:2
S