StructureMap 3.0, the next version of the original IoC/DI Container for .Net is almost done and now is a great time to speak up about any improvements and/or changes you’d like to have in SM3. You can see a list of previous updates (and a shameful pattern of stopping and starting on my part) here. To be honest, my primary goal at this moment — and why I’m able to work on this during day job hours this week — is to improve the performance of our FubuMVC or FubuTransportation applications with a secondary goal is to improve StructureMap’s diagnostic ability to explain what’s happening when things go wrong.
Big Changes and Improvements:
- The exception messages provide contextual information about what StructureMap was trying to do when things went wrong
- The nested container implementation is vastly improved, much faster, and doesn’t have the massive singleton behavior bug from 2.6.*
- All old [Obsolete] 2.5 registration syntax has been removed, and there’s been a major effort to enforce consistency throughout the registration API’s
- The original StructureMap.dll has been broken up into a couple pieces. The main assembly will be targeting PCL compliance thanks to the diligent efforts of Frank Quednau, and that means that Xml configuration and anything to do with ASP.Net has been devolved into separate assemblies and eventually into different Nuget packages. This means that StructureMap will theoretically support WP8 and other versions of .Net for the very first time. God help me.
- The strong naming has been removed. My thought is to distribute separate Nuget packages with unsigned versions for sane folks and signed versions for enterprise-y folks
- Lifecycle (scope) can be set individually on each Instance (stupid limitation left over from the very early days)
- Constructor selection can be specified per Instance
- Improved diagnostics, both at runtime and for the container configuration (still in progress)
- Improved runtime performance, especially for deep object graphs with inline dependencies (i.e., FubuMVC behavior chains)
- The interception model has been completely redesigned
- The ancient attribute model for StructureMap configuration has been mostly removed
- The “Profile” model has been much improved
You can take the pre-release builds of StructureMap 3.0 out for a spin at any time from the fubu TeamCity Nuget feed at http://build.fubu-project.org/guestAuth/app/nuget/v1/FeedService.svc. A public push could come as early as February 1st, 2014, but I’m not pushing to the public Nuget feed until the stuff in the next paragraph is done. My thought is that the initial release will be the core StructureMap package, StructureMap.AutoMocking, and StructureMap.AutoFactory. The new Xml configuration package and a new ASP.Net support package will come later when and if there’s a demand for that.
The issue list is getting shorter and more specific, so I’m hopeful that development is almost to a close. I’m adding a lot of new explanatory acceptance tests as I write the new documentation (with FubuDocs!). Frank is going to push through the PCL compliance and that’ll inevitably lead to some new complexity in how we build and create the Nuget’s in our CI builds.
I’m also going to take the new bits out for a spin with a new FubuMVC application and use that to test out what the new exception messages and diagnostics look like. The forthcoming FubuMVC.StructureMap3 package will embed new diagnostic capabilities.
Early next week, I’m going to try to use StructureMap 3 in a bigger application at Extend Health with an eye toward measuring the new performance versus 2.6.3.
6 thoughts on “StructureMap 3.0 is very nearly done (no, seriously)”
Awesome! I’m looking forward to using StructureMap across platforms (finally!)
Thanks for taking the time to look at the Profile model as I know you’ve mentioned in previous posts that it’s not a feature you’ve used yourself much.
Is it now possible to grab the name of the active profile once you’ve set it?
I’ll add that:
I’ll get that in. It works a little differently now. You’d ask for the Container for a specific profile like:
var profileContainer = container.GetProfile(“other”);
I recently came across MissingNamedInstanceIs and it was the answer to a problem I’ve been having, but I want to configure a bunch of plugins this way in a registration convention. This doesn’t seem to be possible, as it’s only accessible through a CreatePluginFamilyExpression. Is this possible using 3.0 and how would I go about doing so?
I need the strong naming version. How can I get this version?
You’re walking into a buzz saw here;)
To summarize, my official position on strong naming and StructureMap3 is that it’s more harmful than helpful, but that I will support a parallel strong named Nuget package when and if someone gives me a working pull request to do that in our automated builds.