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

Snap - 简单的 .NET 面向切面编程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (16投票s)

2010年4月14日

CPOL

6分钟阅读

viewsIcon

58315

使用你最喜欢的 DI 容器的友好 AOP,以及 CodeProject 社区编码中的一项社会实验

引言

我是面向切面编程 (AOP) 的忠实拥护者。我喜欢不重复自己。长期以来,PostSharp 一直是我在 .NET 中快速实现 AOP 的首选工具。

遗憾的是,PostSharp 现在是一款商业产品,其定价模型超出了我们团队的能力范围。

现在,我并不介意为一款优秀的商业产品付费。我完全支持为优质软件付费。但我一直认为,有一个类似的工具可以在不需要编译时代码编织的情况下实现 AOP,这方面仍然有空间。

PostSharp 的商业化是我启动一个开源项目以开发一个合适的替代品的催化剂。该项目的目标是使用熟悉的以属性为中心的方法拦截约定。

因此……Snap 诞生了!简单的 .NET 面向切面编程。

背景

使用 .NET 实现 AOP 有几种不同的方法。像 PostSharp 这样的工具使用一种叫做代码编织的技术。这是一种花哨的说法,意思是当你构建项目时,工具会改变你的代码和 PDB 文件。这是一种巧妙地操作输出 IL 的方法,而且非常强大。

然而,许多人不喜欢代码编织,因为它感觉太像黑魔法,这让一些人感到困扰。

即使我认为代码编织是替代工具的正确方法,它也引出了一个问题,即 AOP 是否需要代码编织。

控制反转无处不在

如果你是一名有心跳的 .NET 开发人员,那么你不可避免地会听说过控制反转 (IoC) 和依赖注入。如果这些短语对你来说是新的,那么在这里暂停一下,然后去 Google(或用 Bing Google)IoC。

IoC 和 DI 并不是新概念,但它们最近一直备受关注。我认为这部分是由于 ASP.NET MVC 越来越受欢迎,以及 MVC 团队在强调框架的可测试性方面做得非常出色。

所以,既然 IoC 和 DI 风靡一时,我便带着一个简单的使命出发了。

Snap 是一个 AOP 框架,可以与你最喜欢的 IoC 容器无缝协作。

截至本文撰写之时,Snap 可与包括以下在内的五个 IoC 容器配合使用:

  • StructureMap
  • LinFu
  • Castle(和 Windsor)
  • Ninject
  • Autofac

对于首次发布来说,还不错,是吧?Snap 的全部目的就是不碍事。你可能已经在使用众多 IoC 容器中的一个,那么为什么不充分利用这个工具呢?Snap 的全部目的就是让 AOP 变得简单。这就是名字中带有“简单”的原因。它提醒着我们 Snap 应该始终易于使用。

所以我正在使用 5 个 IoC 容器。但是还有很多其他的 IoC 容器,我正在寻求帮助,以便将它们集成、测试并达到标准。

这就是我需要你帮助的地方!

一项社会实验

我在 CodeProject 上撰写文章已经很长时间了。CodeProject 是我非常喜欢的网站,运营它的人也很棒。

但是,尽管我非常喜欢这个网站,但其中却缺少一个重要部分:协作。

通常,当我为 CodeProject 撰写文章时,我会把我的小演示项目打包,然后与文章一起上传,供你(读者)下载。这对于教育目的来说很好。但这次我追求的是不同的东西。

我想围绕这个项目建立一个团队。

我不想仅仅发布代码,然后等你审查它并投票表决你有多喜欢它。说实话,你的一半投票是基于你有多喜欢某人的写作。

我想要的是参与!我希望你贡献、参与、投入、提供帮助,并以其他方式帮助构建一些伟大的东西!

这就是实验——利用 CodeProject 上丰富的资源来帮助组建一个团队。

源代码控制

由于 CodeProject 没有管理代码的方法,我建立了一个公共仓库,人们可以轻松地获取、修改和提交代码库的更改。

我选择了 GitHub 作为项目的归属地。如果你不熟悉 Git,它是一个引人入胜的工具。Git 是一个分布式、断开连接的源代码控制系统。它使分支和合并变得轻松简单。而且它也速度惊人

现在我知道你是一名 .NET 开发人员。当你听说 Git 主要是一个命令行工具时,你可能会停止阅读这篇文章。

别走……继续阅读……还有希望!

是的,Git 主要是一个命令行工具。但让我提出几点,说明为什么你不应该因此而却步。

  • 你真正需要知道和使用的命令只有几个。
  • Git 有很棒的文档。
  • Git 内置了大量的帮助
  • 确实有图形用户界面工具可以提供帮助。
  • 作为一名开发人员,学习新事物没有什么不对。拓宽你的视野。
  • Git 拥有如此强大的功能,以至于你会忘记命令行。
  • 你可以将 Git 集成到 Visual Studio 中(查看 Rob Conery 在 Git 上的 TekPub 视频)。

我个人正在使用一个名为 msysgit 的工具,它既是 Windows 的 GUI 工具,也是命令行工具。

加入团队

那么,你准备好投入其中了吗?太棒了!让我们从基础知识开始,问答形式。

问:Snap 网站在哪里?

答:网站是 http://www.simpleaspects.com/,上面有一般信息和博客。

问:源代码在哪里?

答:源代码在 GitHub 上,地址是 http://github.com/Acoustic/Snap

问:有文档吗?

答:有一个官方项目 Wiki,地址是 http://wiki.github.com/Acoustic/Snap/

问:我可以为这个项目做贡献吗?

答:是的!这就是这个项目的意义所在。

问:你正在使用反射吗?

答:是的,但 Snap 使用了一个名为 Fasterflect 的库。它比传统的反射快得多。

问:除了 PostSharp,还有其他的代码织入器吗?

答:是的,但大多数这些项目都已经停止维护或针对旧版本的 .NET。

问:Snap 易于使用吗?

答:是的。这是一个完整的示例,配置 Snap 以与 StructureMap 配合使用。

//Configure Snap to use StructureMap
SnapConfiguration.For<StructureMapAspectContainer>(c =>
    {
        // Tell Snap to intercept types under the "Snap.Tests..." namespace.
        c.IncludeNamespace("Snap.Tests");

        // Register a custom interceptor (a.k.a. an aspect).
        c.Bind<HandleErrorInterceptor>().To<HandleErrorAttribute(); 
    });

// Configure your own types with StructureMap.
ObjectFactory.Configure(c => c.For<IMyType>().Use<MyType>());

// Get an AoP wrapped instance of your type from StructureMap
var badCode = ObjectFactory.GetInstance<IMyType>();
public class MyType : IMyType
{
    [HandleError] // This is your attribute that will be intercepted.
    public void InterceptedMethod()
    {
        // Elided
    }
} 

就是这么简单!

广为传播

我意识到并非所有人都有时间投入到一个开源项目中。这是一个艰巨的任务。即使你没有时间或兴趣,我仍然希望你发现 Snap 是一个有用的工具。

如果那是你,那么请帮助传播这个消息。也许你认识一些想参与的人。指引他们阅读这篇文章或访问 GitHub 网站。

没有社区,项目将无法运作!

© . All rights reserved.