I’ve been absurdly bogged down most of this calendar year rewriting the Storyteller tool we use at work for acceptance and regression testing. Now that I’m past that crunch, I’m finally able to focus on other things like StructureMap, this blog, and the still unfinished StructureMap documentation. That being said, here’s what’s going on with StructureMap now and in the near future.
StructureMap and I have earned a bad reputation over the years for being under-documented and having out of date documentation. As of about an hour ago, I finished converting the existing StructureMap 3.0 documentation site to the far better “living documentation” tooling I built as part of my Storyteller work earlier this year. There are still far too many holes in that site, but I’m hoping to knock out a couple topics a week until they’re complete. With the new tooling, I think it would be much easier for other folks to contribute to the documentation effort.
Strong Naming and StructureMap. Sigh.
My position on strong naming with StructureMap 3 and beyond is that I do not want the main packages to be strong named. I have said that I would consider supporting a signed version of StructureMap 3 in a parallel nuget if someone did the pull request for that support. Lo and behold, someone finally did that, so look for the structuremap-signed package if you absolutely have to have a strong named version of StructureMap. That being said, I still fervently recommend that you do not use the signed version unless you absolutely have to in your situation.
StructureMap 3.2 in 2015
I’m just about to start some work on some new features and internal improvements for StructureMap that will make up a 3.2 release. Using Semantic Versioning rules, there should be no breaking API changes from 3.* to 3.2. Right now, I think the major changes are:
- Optimize the type scanning and convention registration. This was the one big subsystem that I left essentially untouched in the push to 3.0 and sure enough, it’s not holding up well for some users. I have some ideas about how to improve the performance and usability of the type scanning that I have already started in a private branch.
- Optimize and tighten up the “TryGetInstance()” runtime behavior under heavy multi-threaded loads. I don’t use this feature myself and I try to discourage its usage overall, but all the ASP.Net frameworks (MVC & Web API) use it in their integration and that’s been problematic to a couple folks.
- Some new syntactical sugar to verify specific container registrations
- New types of Container wide conventions or policies that act against the entire container
- Take advantage of default parameter values
- Features to make StructureMap easier to configure from mix and match sources for highly modular architectures
StructureMap 4 in 2016(?)
I *think* that StructureMap 4.0 is going to be all about the new stuff:
- Use Roslyn runtime code generation in place of the current strategy of building then compiling Expression’s at runtime. I don’t know that this is going to result in faster code, but I am hopeful that it makes the guts of StructureMap’s internals more approachable. Really though, that’s because I want to use the Roslyn functionality on a proposed replacement for FubuMVC next year.
- Maybe use Roslyn’s support for compiler symbols in place of the existing type scanning?
- Support CoreCLR
Re-tooled the Codebase
I changed up the build automation tooling for StructureMap a couple weeks ago in an attempt to make the code easier to work with for more mainstream .Net developers.
I started from:
- Rake (Ruby) as a build scripting tool
- The old Ripple tool from the FubuMVC family of projects for Nuget support
- The build script had to be executed at least once before working with the code to generate some required files and fetch all the necessary nuget requirements
- Good ol’ fashioned NUnit for unit testing
The usage of Ruby for build automation has been off-putting to many .Net developers and the mass majority of .Net developers seem to prefer being able to open Visual Studio.Net and just go to work. Based on the twin desires to make the StructureMap build faster and easier for most .Net developers, the new build tooling changed to:
- Use Paket as the nuget management tool with its auto-restore capability
- After some conversations with the NancyFx team over the years, I stole their idea of using Rake but making it completely optional for potential contributors
- Replaced NUnit with Fixie, a much better and faster testing library from some of the Headspring folks here in Austin