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

基于组件的对象扩展器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (3投票s)

2011年10月30日

CPOL

5分钟阅读

viewsIcon

27945

downloadIcon

325

.NET 的基于组件的对象可扩展性框架

什么是 CBO Extender

基于组件的对象扩展器 (CBO Extender) 是一个对象可扩展性框架。顾名思义,它是基于组件的,这意味着它使用接口,并且直接扩展对象而不是扩展它们的类型。CBO Extender 可用于扩展任何接口方法,包括第三方接口、.NET Framework 接口或您定义的接口。它是一个通用工具,通过将行为附加到对象的接口方法来为对象添加功能。

扩展对象与扩展类型

扩展类型涉及设计时的工作,并且是一个中间步骤。目的是使扩展类型的对象具有附加功能。那么,直接扩展对象而不涉及中间步骤呢?这就是 CBO Extender 的基本思想。

假设它足够简单且足够强大(简单意味着容易上手,强大意味着可用于大多数严肃的编程任务),扩展对象具有以下优点:

  • 组件稳定
  • 根据需要,在组件的客户端进行扩展
  • 更精简的应用
  • 维护量小

CBO Extender 的功能与非功能

CBO Extender 的功能:

  • 直接在对象上工作
  • 仅扩展接口方法以及任何接口方法
  • 装饰现有方法
  • 将方法用作行为

CBO Extender 的非功能:

  • 不创建、更改或派生自组件
  • 不扩展非接口方法
  • 不注入现有方法
  • 不使用类作为行为

CBO Extender 的组成部分

CBO Extender 由动态装饰器和 AOP 容器组成。

动态装饰器 源于装饰器模式。它解决了装饰器模式的相同问题:动态地为现有对象添加附加功能。然而,动态装饰器采用了完全不同的方法。它不创建装饰类,而是使用定制的 .NET 代理技术来拦截方法调用,并在目标方法执行之前或之后应用附加功能。动态装饰器的一个优点是它不需要设计/维护装饰类。它易于使用,并且可以应用于任何组件的任何对象。文章 动态装饰器模式 详细解释了动态装饰器。文章 使用动态装饰器为对象添加切面 讨论了动态装饰器的重要特性。

AOP 容器 将动态装饰器与 IoC(控制反转)容器集成。它使任何 IoC 容器都可以通过配置或代码获得 AOP 功能。文章 AOP 容器 讨论了通过配置为 IoC 容器添加 AOP 功能。文章 AOP 容器 2 讨论了使用代码为 IoC 容器添加 AOP 功能。

CBO Extender 中的切面

在大多数 AOP 工具中,切面代表横切关注点,通常采用某些特殊类的形式。在 CBO Extender 中,切面是具有特定签名的**方法**。虽然这些方法可以处理日志记录、安全检查、审计等横切关注点,但它们也可以处理排序和分组等关注点,这些关注点特定于某些类型而不是横切的。在 CBO Extender 的上下文中,切面是**方法**,可以实现任何逻辑,包括但不限于横切关注点。

使用 CBO Extender

您可以直接在代码中通过调用其 CreateProxy<T> 方法来使用动态装饰器。有许多文章描述了它的用法,例如,动态装饰器、Unity 和 Castle DynamicProxy 对比

如果您使用某个 IoC 容器,您可以使用 AOP 容器将 CBO Extender 与您的 IoC 容器集成。有两种方法可以将 AOP 容器与 IoC 容器一起使用:通过配置或使用代码。文章 AOP 容器 讨论了如何通过配置与 MEF、Unity 和 Windsor 一起使用 AOP 容器。文章 AOP 容器 2 讨论了如何使用代码与 Unity 和 Windsor 一起使用 AOP 容器。

CBO Extender 与应用程序开发

CBO Extender 通过使在运行时轻松地将行为附加到组件对象,从而补充了基于组件的开发。以下是使用 CBO Extender 进行应用程序开发的指南:

  • 以通用方式设计组件以满足业务需求
  • 将横切关注点设计为共享模块中的通用切面方法
  • 将其他关注点设计为本地或匿名方法形式的特定切面方法
  • 按需扩展对象

以下文章讨论了上述指南如何应用于各种应用程序类型:

CBO Extender 与其他代理技术

CBO Extender 使用基于 .NET 代理技术的定制代理。还有其他定制代理,如 Castle DynamicProxy 和 Unity Interceptor。

CBO Extender 通过其切面与其他代理技术区分开来。在 CBO Extender 中,切面(行为)是具有特定签名的**方法**(也称为切面方法)。在其他代理技术(Windsor 或 Unity)中,切面(行为)是实现特定接口的**类**(也称为行为类)。

切面方法在概念上比行为类更简单。毕竟,如果一个方法就能解决问题,为什么还需要一个类呢?切面方法还能够访问目标和调用上下文。文章 动态装饰器、Unity 和 Castle DynamicProxy 对比 详细介绍了它们在性能和功能方面的差异。

CBO Extender 与 PostSharp

PostSharp 将代码注入方法,而 CBO Extender 装饰方法。PostSharp 在设计时向类添加行为,而 CBO Extender 在运行时向对象添加行为。

尽管 PostSharp 可以在一个类中做几乎任何事情,但它很难做得正确。大多数时候,在设计一个类时,过早决定是否需要为该类添加切面。文章 对象切面与类切面 讨论了与为类设计切面相关的一些问题。

我确实发现了一个 PostSharp 可以用于实现 WPF 应用程序的 INotifyPropertyChanged 接口的案例(请参阅文章 使用 AOP Unity 容器为 WPF 应用程序配置切面)。但总的来说,在类级别处理切面不是一种最佳实践。

为什么选择 CBO Extender

  • CBO Extender 拥抱基于组件的开发
  • 组件在设计时与切面分离,并在运行时保持分离
  • 切面按需在运行时绑定到组件的对象
  • 通过链式调用切面并访问目标和调用上下文,切面可以非常强大
  • CBO Extender 简单轻量

© . All rights reserved.