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






4.33/5 (16投票s)
使用你最喜欢的 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 网站。
没有社区,项目将无法运作!