I Love Reviews

I’m a bit steamed. I walked around the block, hugged my cat, infused my chakras with candles made from persimmon and sage by a monk in Kalalau… I even took a few deep breaths. It’s not working and I feel compelled to tell you why.

I’m a bit steamed. I walked around the block, hugged my cat, infused my chakras with candles made from persimmon and sage by a monk in Kalalau… I even took a few deep breaths. It’s not working and I feel compelled to tell you why.

I built SubSonic for the greater good of the community and I don’t expect everyone to use it. In fact I know a lot of people who don’t care for it and that’s really fine – to each his own.

But this is the first time I’ve had a longtime user come out and write a blog post “reviewing” SubSonic 3.0 and.. well basically thrashing it.

I don’t mind the thrashing – in fact I welcome it. Right between the eyes, over stone-cold ice is the easiest way. That’s how we make stuff better.

But there’s nothing I can take from this post that actually *helps* me make it better. It was written, as far as I can tell, in the same way that this post is being written: frustration boiling over.

Ahem. Sorry. I just took a break and weeded my dead garden – it’s not fun (or productive) to write stuff when cranky. Let’s try and be constructive. I’ve read the post 3 times over and tried to narrow down the points, which seem to be:

  1. Where’s SubCommander? What’s “T4”? How does this work?
  2. Why do I need to use IList<T> instead of typed collections? I like those better.
  3. I don’t read READMEs – installation was too hard.
  4. You’re not naming things for me anymore – I’m lost.
  5. You’re not fetching by Primary Key anymore.
  6. You’re not fetching by column/value anymore
  7. I don’t like LINQ – I can’t avoid it with SubSonic 3.
  8. Views aren’t generated.
  9. There’s no backwards compatibility – I can’t use SubSonic 3.
  10. I haven’t spent enough time with Stored Procedures to figure out how to get values back.
  11. Your forums are gone so I’ll assume getting help is really hard.
  12. Your docs suck and are non-existent.
  13. I’m super disappointed that it didn’t “just work”

The kicker to the entire post is this lovely summation:

I really can’t express how disappointed I am with this release. I believe that the new version should have been released with at least a thought of how the existing 2.x user-base could easily migrate their code to the new release. With all of the missing functions from 2.x and the new coding requirements for 3.0, I wish SubSonic 3 would have forked off and become another project to focus on Linq. 

As of right now, all of my corporate projects use SubSonic 2.x. I have one small corporate project that I’m trying to use SubSonic 3.0, but so far the current version is failing miserably at doing even the simplest of things that SubSonic 2.x did without any problems. I’ve spent so much time trying to get SubSonic 3.0 to work, I’m wishing I’d would have just continued to use the previous version or forget about SubSonic all together. Even the simplest of tasks such as retrieving records is unusable since not all of the fields are bring properly loaded into the objects

Since this is the first time I’ve heard from James (and he chose the forum) – well I spose I’ll respond on my blog too.

Here goes:

1) SubCommander has been replaced by T4, which is automatic code generation built in to VS. It works by dropping into VS or by, as you mention, having to right-click/run tool.

2) I moved to IList<T> because it’s better programming. TypedCollections do offer partials – but inheriting from IList<T> is much better for future programming. The less a consuming class knows, the better.

3) The README file has the installation instructions in there. 3 Steps to happiness.

4) Naming is our biggest issue generator – so now it’s completely in your control. You solved your issue exactly as I would have suggested – in one function, as the project required. The Inflector (the magic bits that clean the names up) is in there as well so you can have your nice names.

5) Fetching by key in a constructor is not the best way to do things – but if you want to do this it’s all of 3 lines in the T4 file. The reason it’s better to have a factory is because it will return null. This can’t happen in the constructor and you have to code your way around it.

6) “Magic Strings” – they’re just not needed when you have lambdas. This offers type-safefy etc. So instead of 2 Fetchers, you now have 1 SingleOrDefault(). Less code==better.

7) If you don’t like LINQ I won’t be mad. Just don’t judge the project based on LINQ mmkay?

8) Views aren’t really needed when you have LINQ. If you have a complex View then I might suggest just using an SP.

9) Yes 3.0 is a lot different than 2.0 – this is a full rewrite based on language enhancements. If I didn’t shed some unneeded stuff then I’d be accused of bloatware.

10) Stored Procs haven’t changed -  you can use ExecuteScalar() or ExecuteReader() – whatever floats your boat.

11) Our response time on StackOverflow is 3-4 times faster than it was on our forums. People are getting their answers a *lot* faster – what’s your experience been?

12) I spent 3 months prepping our wiki – there is 5 times the content in there. I don’t know what else I can do for you on this.

13) You and me both.

In closing I’ll add that I made the tough choice to break backwards compatibility in the name of keeping things slim – otherwise maybe the above post would be “SubSonic 3 is Bloated!”.

My answer here, I spose, is that 2.x isn’t going anywhere – if it works for you, keep using it and yes, you can think of 3.0 as a fork if it makes you feel better. It doesn’t address any of your issues above – but I’m not sure what could short of me doing more stuff for you.