Yesterday, Phil got me to watch the SubSonic screencast (it was actually called the ASP.NET ActionPack and was since renamed). I'd seen posts about it on my main RSS feeds and had ignored it because everyone had been giving their posts titles like "ActionPack - Ruby on Rails for ASP.NET." I've watched all the ROR screencasts and have been a little underwhelmed1, so I didn't bother reading further. Big mistake.
SubSonic is one of the coolest web development things I've seen in a while. The 20 minute screencast is well worth the time, but here's the basic idea:
- Add a reference to the SubSonic DLL
- Add a few lines to your web.config - tell the ActionPack how to connect to your database, and add a block that tells ASP.NET to use the SubSonic build provider.
- (a miracle happens)
- Enjoy the magic.
What do I mean by magic? Again, I'll ask you to watch the screencast rather than read my boring description, but I'll give it a shot. The SubSonic build provider gives you a full featured data access layer without adding any code to your project (unless you want it). That takes care of the biggest problem with code-gen'd DAL's - the piles of generated code files which clutter up your project and need to be kept up to date although many of them may never be used. Second cool feature: a scaffold server control which gives you the same kind of basic admin functions that ROR scaffolding provides (and a few extras, like following foreign keys for dropdowns). For example, when pointed at the infamous Northwind database, here's what you get from the following server tag (no other code required):<cc1:Scaffold ID="Scaffold1" runat="server" TableName="Products"></cc1:Scaffold>
Aside from auto-created collection classes, there's a nice dynamic query system:
qry.Top = "10";
qry.OrderBy = OrderBy.Desc(Product.Columns.UnitPrice);
GridView1.DataSource = qry.ExecuteReader();
I particularly like the column and table name structs - I commented yesterday that it would be cool if he added them to eliminate the need for string parameters; less than two hours after I posted the comment he posted a new release with that feature. That allows you to code to something like Product.Columns.UnitPrice rather than "UnitPrice", so you get both autocomplete and compile time checking. Nice!
Here's where Dr. Jeckell's "hey, check out this neat thing" post ends and Mr. Hyde takes over... Rather than letting this languish on the list of neat tools ASP.NET bloggers talk about, Microsoft should do something out of character - they should ship SubSonic with Atlas.
Well, first, the rationale: SubSonic is a great next step in the "less code is good" philosophy of ASP.NET 2.0. At a minimum, adding SubSonic to ASP.NET would be a great bridge until DLINQ comes out. It would be great to have ASP.NET span the range from ROR "it just works" simplicity to the high end systems we all know it can do.2 Even ASP.NET superstars are admiring ROR's simplicity, and ROR is quickly becomming synonomous with Web 2.0.
Yeah, but SubSonic's out on CodePlex. That's good enough, right?
Why does Microsoft need to get involved? Why not just let it hang out on CodePlex and write a little blurb on the ASP.NET site? Because most Microsoft developers only use what's in the box. Even if the developers want to use it, their bosses or co-workers will shy away from "that crazy blogger open source stuff." DotNetNuke took years to build the following it has, and even still it's not nearly as well known as Atlas, a relative newcomer to the ASP.NET toolbox. By adding this to the Microsoft endorsed ASP.NET toolkit, millions of developers would actually start using it.
Atlas? What's that got to do with a data abstraction layer?
Well, it makes sense for a few reasons:
- Atlas is at just the right place in the product lifecycle. It's positioned as an official "extension" of ASP.NET. It's got the Microsoft seal of approval, but it's still a separate download at this point.
- SubSonic needs some AJAX glitter to fare well against ROR, and Atlas could benefit from a great Hello World demo-ready application. The two are made for eachother if you look at things from the where the web development world is at, rather than how the Microsoft development tools are positioned. The Atlas website says Atlas is a free framework for building a new generation of richer, more interactive, highly personalized cross-browser web applications. SubSonic fits in well with that description. Imagine the demo you could pull off with a zero code data abstraction layer, a scaffold in an UpdatePanel, and some Atlas controls bound to SubSonic populated datasources; imagine how efficiently you could wow a client. Atlas with SubSonic would make a killer combo.
But, isn't SubSonic an open source kind of project?
It's licensed under the Mozilla Public License, which is pretty simple - you can use, redistribute, and even sell software using MPL'd code, but if you modify the MPL'd code you have to publish your changes. It's not like the "viral" GPL, which requires that you GPL your software to make use of GPL'd code. So, to say this in English, I believe that Microsoft could bundle the SubSonic DLL with Atlas, and the most they'd need to do is include a clause in the Atlas EULA stating the SubSonic code is under the MPL and the source code is available on CodePlex. They'd be free to make any changes to SubSonic as long as they released them on CodePlex, which doesn't seem like it would be a problem.
But aren't there already better implementations of Ruby on Rails for ASP.NET?
Yeah, there's MonoRail. Watch the screencast; from what I've seen I like SubSonic a lot better. SubSonic doesn't just tack ROR onto ASP.NET, it learns from it but plays smart with the .NET framework. It leverages the build provider capability, the code behind model, the server control system, etc. Rather than taking over the project with tons of added code, it adds classes which are invisible until you use them. It seems like a MonoRail project is a MonoRail project, whereas a SubSonic project happens to use SubSonic where appropriate, and can factor it out where appropriate.
But didn't this just come out? You're nuts to be talking about shipping it!
Well, yeah. Of course Microsoft would want to review the code to make sure that it's up to snuff. However, Rob Conery (the author) is the Chief Architect of the Commerce Starter Kit for ASP.NET 2.0 and an ASP.NET MVP with a great track record. Why not contract with him for 3 months to buff it out a bit?
1Ruby on Rails advances some great web development values, but it seems like a lot of work compared ASP.NET 2.0, especially if you're using some code-gen, ORM's, or frameworks. You're left writing a lot of markup, and it's the spaghetti code kind of markup (code meatballs mixed with HTML markup noodles) that drove me nuts with "Classic ASP" and PHP. I really like the code behind approach in ASP.NET, and I definitely prefer C# and Visual Studio.NET to Ruby and a text editor that may have ROR syntax support, but no designers. Then there's the extension story - I haven't used the ROR corelib, but it sure looks like it's a lot less powerful than the .NET framework.
2No, I'm not dissing ROR. I know it runs Basecamp and a bunch of other big applications. However, I think if you compare the feature sets of ROR and ASP.NET you'd agree that ASP.NET seems better suited for enterprise applications.
I'm having trouble posting comments, so here are my replies to the comments below:
1. All the ActionPack bashers are upset because it's not doing the whole ROR MVC thing. Bah. ActionPack / SubSonic isn't ROR for ASP.NET, is's a better way of doing things with ASP.NET. MonoRails has a place in the full blown MVC pattern approach to web development; I'm not knocking that. SubSonic is great because it works with and augments what ASP.NET does in the way it works.
2. Not sure what your point was about ASP.NET developers not being web developers, etc. I've done a lot of web development over the past 10+ years, and I believe that less code is generally a good thing from a maintenance perspective. Those who will only use the designer and don't understand the markup would probably benefit from a simple DAL system rather than hand writing their own code or having to set a lot of properties in various server and web controls. One nice thing about this approach is that it scales - you can quickly build out a site with SubSonic, then convert SubSonic DAL code use another form of data access (hand written / NHibernate / EntLib you name it) without any structural changes. It seems like you might be upset about the markup that ASP.NET generates, which doesn't really make sense in reference to server side data access.
3. You don't really explain yourself on the last point about enterprise development. My point is that ASP.NET has a good offering for large or complex sites (MySpace, Nasdaq, many banking systems, etc.). I'm sure ROR could potentially do those kinds of jobs, but it would take a lot more work to do and code to maintain.
I never really liked the strongly typed DataSet approach. Your build provider approach to them might make that better, but I'd still much rather code against DataReaders. SubSonic's DAL gives you quite a bit more than a DataSet provides, too - dynamic query, scaffolding, etc. Regarding requiring data access, I'm not sure that's true. SubSonic could build out your DAL when it is connected, and not build it when it's disconnected. I don't know if it supports that right now, but if it doesn't it doesn't seem difficult to unwire it when you're disconnected.
My original post just said that Microsoft should ship SubSonic, but how exactly would they do that? It's an open source project; it would look wierd to try to release it separately. So then I wrote that Microsoft should ship SubSonic with the next release or update to ASP.NET, but when will that be? Microsoft ususally doesn't push out new functionality with smaller updates, so it wouldn't be until a service pack or the next ASP.NET release, and when will that be? Then I was thinking that it needed to be something on the same level as Atlas, but since it's just one DLL, why not just drop it in Atlas?
Regarding Microsoft shipping something like Castle or another ROR framework, I'm not so sure. If they did, I'd suspect it would be a large p&p EntLib like release, which doesn't fill the same niche that SubSonic does - minimal code to get data on the screen.
BLINQ looks cool, but a command line generator is not near as clean as a build provider. Also, it looks like it generates a lot of code [ http://forums.asp.net/thread/1346141.aspx ]; SubSonic builds the DAL without adding the code to your project. Maybe BLINQ should add a build provider?