嗯……嗯……怎么说呢……
我目前(就像现在一样)正在努力将 SubSonic 替换为 PetaPoco。我想这说明了什么。
并不是说 SubSonic 很糟糕,而是它不太适合我的开发方式。对于希望在这一点上采用它的人来说,注意该项目绝对缺乏活动似乎非常很重要。
首先,SubSonic 不适合我的最大原因是 LINQ。
可以肯定的是,让编译器检查所有属性的使用是很有吸引力的。但是,在实践中,它根本不适合查询。
如果您非常坚持使用每表类和 ActiveRecord,我想没问题。但是,每当我们必须进行任何超出此范围的查询(任何涉及多个表或任何超出最简单的 where 子句的查询)时,这都是一场噩梦。关联不能直接在 SubSonic LINQ 查询中使用,就像在 EF 或 nHibernate 中一样,这可能是最大的痛点。
例如,这样的查询将不在 SubSonic 中工作,但在 EF 中可以:
db.Accounts.Where(a => a.OwningUser.Email != null);
我最终的结果要么是对数据库进行 多次 往返以组装结果,要么使用 SubSonic 的 CodingHorror 类直接使用 SQL 进行查询,并且无法简单地将它们具体化为POCO(再次,当超越简单的每表类时)。
我还发现每个 LINQ 提供程序都支持不同的操作集,有时相同的逻辑操作在提供程序之间的语法和使用会略有不同。这使得编写大多数查询非常耗时且容易出错。 SubSonic 的 LINQ 提供程序不乏古怪和功能不足的问题。在支持的操作、可用性或执行速度方面,它与 Linq-2-SQL、实体框架或 LINQ 相去甚远(准备好学习在 LINQ 中为 SubSonic 编写连接的新方法 - @ 987654322@).
除了拖累生产力之外,很容易忘记您正在编写的 LINQ 代码是非常特定于提供商的。 ANSI SQL远比 LINQ 更加标准和交叉兼容。
LINQ 还用规范等技术重用代码的可能性吸引了我,但充实这些远非易事,最终结果甚至不值得付出努力。我在这里遇到的障碍主要是因为 SubSonic 的 LINQ 提供程序不支持关联。
我觉得 SubSonic 在 LINQ 之外的设施充其量只是平庸(在我看来)。
其次,重要的是要知道 SubSonic 无论如何都不是一个活跃的项目。
SubSonic 的最初创建者 Rob Conery 不再参与该项目。 The last commit Rob made was in July 2010.
The last commit to the project at all was 3 months ago,despite nearly 100 outstanding issues。据我所知,自从 Rob 停止从事 SubSonic 工作以来,还没有发布任何版本,甚至没有发布小版本(尽管仍然在项目中闲逛的人一直是 talking about a release for more than half a year)。
The Google Group for SubSonic 曾经很活跃,但现在不那么活跃了。还有the official website for the SubSonic project has been yellow-screening-of-death for a while(网站不再是黄屏)。
数据访问的新热点是微 ORM。实际上,SubSonic 的创建者通过Massive 开启了这一趋势,紧接着 StackExchange 工作人员发布了Dapper,后来又出现了PetaPoco。还有几个。虽然我们通过在我们的代码库中添加 SQL sn-ps 来放弃一点编译器检查,但我发现 micro-ORM 比 SubSonic 更适合我的开发风格。
我对 nHibernate 的体验(尽管有限)是,它在大多数情况下都过于复杂,即使在合适的情况下,它也绝对扼杀了我的应用程序启动时间。还有一个很高的学习曲线(你可能已经过去了),但也有几种方法可以做......基本上一切......所以它只是在我的过程中增加了更多的决定(让我慢下来)。
使用 PetaPoco,我可以编写熟悉的 SQL - 我很快而且相当擅长 - 并将它们具体化为 POCO,我立即知道该怎么做。稍加一点架构和组织以及自动化集成测试,我一点也不觉得嵌入 SQL 有点脏。
哦,我想最后一件事 - SubSonic 远不是获取数据的最快方式。可能并不重要,但事实证明它对我们来说很重要。
总结(对不起文字墙):
从绝对意义上说,SubSonic 并不是坏事。它似乎根本不适合我尝试使用它的方式——其中很大一部分是因为 LINQ 仍然是一个泄漏的抽象,而且它的泄漏方式与我习惯的不同。
开发工作几乎不存在这一事实是好是坏。好,它是稳定的,在某种意义上被认为是“完成”。不好,它缺少功能,可能有一些错误,而且性能不是最好的——而且没有人在努力改进它。