lcomplete's Blog

一个带着极客精神正努力成为黑客的程序员

大型 ASP.NET 应用中常用的开源项目

| Comments

最近几年,涌现了一大批优秀的开源项目,开源软件越来越受到人们的重视,现如今,可以说几乎没有一个大型软件是完全独立于开源项目的,越来越多的应用构建于开源项目之上,ASP.NET 应用也不例外,以往不太 “Open” 的微软也开始大力发展开源项目,将其 MVC 和 EntityFramework 等框架纷纷开源。

使用开源软件往往意味着减少软件开发成本、提升软件质量,开源是一股强大的力量,它帮助我们减少重复性的工作,提升我们这些程序员的生活品质,今天我们就来列举一些在构建大型 ASP.NET 应用中经常使用到的开源项目。

  1. log4net

    log4net 是 log4j 的一个移植版本,它是一个强大的日志记录组件,可以使用不同的日志级别记录日志,也可以将日志写入到文件、控制台、事件日志和数据库中,通过在XML配置中修改日志级别,可以很灵活地控制哪些日志需要记录,根据需要在开发环境和生产环境中定制配置,可以灵活地对应用程序进行跟踪调试。

  2. Json.NET

    AJAX 的广泛使用在一定程序上促进了 json 数据格式的流行,作为轻量级的数据交换格式,json 在很多场合下比 xml 更加合适,那么对于这个频繁使用的数据格式,一个高性能的序列化、反序列化工具自然是必不可少,json.net 便满足这一需求,使用它你可以灵活高效地在 json 数据和 .net 对象之间进行转换、使用 linq 语法对 json 数据进行查询、生成缩进好的 json 、在 json 和 xml 之间进行转换。

  3. StructureMap

    ASP.NET MVC 框架很好地贯彻了面向接口编程这一设计原则,这使得我们可以很容易替换 MVC 框架中的一些默认实现,比如通过替换默认的依赖解析器,我们可以得到 Controller 中获取依赖对象的控制权,因此便可以决定 Controller 中使用的 Service 接口或 Repository 接口的具体实现。如何决定接口的具体实现是什么?如果初始化对象需要提供构造参数,那么该如何处理依赖?这里面涉及许多枯燥的配对工作和复杂的依赖处理工作,自己实现一套 IoC 容器的代价是巨大的,还好我们有开源的 StructureMap。有很多文章介绍 StructureMap,说它是一个轻量级的 IoC 框架,其实不然,StructureMap 其实是一个代码量大且比较复杂的框架,也许是因为它没有其他第三方依赖,且基础功能使用起来比较简单的关系,使人们产生了这种错觉。

    StructureMap 除了一些大多数 IoC 框架都有的一些功能外,还有一些非常强大的特色功能,比如扫描程序集自动匹配子类型,这能够减少许多不必要的配置,此外它还提供了插件系统,通过编写插件可以使应用程序具有高可伸缩性,配合面向切面编程组件可谓是如虎添翼。

  4. Quartz.NET

    随着 Web 应用的复杂性不断加大,单纯的响应处理机制将无法满足一些需求,比如大量的数据统计、报表输出,如果等到请求出现再处理,那往往是不可接受的,这个时候我们需要将一些任务放在后台定时运行,对于简单的任务,也许使用 .net 自带的 Timer 就足以搞定,但应用是在不断进化中的,为了得到良好的可扩展性,我们应该使用一种可以满足更多触发条件的机制,可以说 Quartz.NET 是最佳选择。

    Quartz.NET 是一个功能齐全的任务调度系统,任务配置可以使用 XML、数据库或编程方式,使用它我们可以在任务调度上获得很高的可扩展性。有时候高可扩展性也意味着高复杂性,就像一个复杂的设计模式会带来理解上的困难一样,庆幸的是引入 Quartz.NET 并不会带来什么复杂性,在配置中可以使用 Cron 表达式描述任务的触发时间,只要熟悉这个概念便能完美控制任务运行时间。

    最后值得一提的是,Quartz.NET 提供了远程代理的方式控制在远端服务器上的 Quartz 任务,这大大方便了任务的监控、管理和测试。

  5. Topshelf

    刚才说到对于大型应用,后台的任务调度是少不了的,如果把任务放在网站中运行,那将是不可靠的,因为很多情况会导致 iis 应用程序池重启,所以一般情况下将使用 Windows 服务,使用 Topshelf 就是创建 Windows 服务的一种方法,它拥有跨平台特性,相比 .NET 中提供的创建 Windows 服务的 API,它的优势是使用简单且可以从控制台运行,这给开发和调试服务提供了非常大的便利。

.NET 中已有的优秀开源项目非常之多,并且不断地有新项目涌现,针对特定需求的组件大家可以上 github 上找找,本文就先列举这些吧。

Comments