There is new version of really usefull library used for DI, IoC – called StructureMap – released. You can find more about that new version on the blog from Jeremy Miller, here
Jeremy explains what was changed there and what’s new but … we miss the up-to-date documentation ….
It’s really cool library, we use it quite much on our projects and it’s really a killer against other similar libraries (I’ll write a post about it later). I was looking forward to check the new version and use it but here are my comments:
1) API was changed quite massively and there were made obsolete many methods and few were removed. I must say, that the comments used on the Obsolete attribute are not usefull in all situations the old version was able to be used (see example bellow).
2) The release is missing an up-to-date documentation describing how to migrate from old version to the latest version. The migration to the new version is not very straightforward, IMHO. The package (binaries), which you can download from here contains only binaries ;o), no documentation, no tests (which can act as a kind of the document as well), etc.
I think the NUnit tests are very good source of the documentation and explanation how to use the explored library and it should be UP-TO-DATE. So for all who wants to migrate to new version of Structure and dont want to wait for the documention or Jeremy’s blogs I propose the following:
download the full package which includes also NUnit tests 😮 from here (scroll down and take the latest commit, it includes more than 11MBs of data) and spend some time with analyzing code and NUnit tests.
I really support the libraries with Fluent approach. Structure map has it but I think, some changes, which should be more fluent in the newer version are less fluent now.
Example: AsSingleton() construct replaced with Singleton(), as following:
I think, more fluent version would be:
I think it’s more fluent. I must say it took me a while to find it out, especially when old construct was completely different with AsSingleton() at the end ;o I know, my suggestion i’s small change, but I would say, it would bring more fluent voice.
Another, but I think, bigger change was related to situation when we want to add the named instances to the container. It’s connected to the class IInstanceExpression<T> and its OfConcreteType<PLUGGEDTYPE>() method like on the following:
The obsolete attribute advice what to use is nice but useless in the situation when we use AddInstances() construct.
In this case we are not able to avoid using OfConcreteType<T>(). There are 2 possible solutions:
The first is to use the For<T1>().Add<T2>.Named(“name”) like on the following picture:
the old way which was used in 2.5.4 version:
and live with the fact that there will be warnings.
I checked the NUnit tests from StructureMap because I wanted to know how to use this construct correctly and I was disappointed that the there is used the OLD version of the solution (the obsolete methods with the warnings) like the following:
It’s a shame that the release 2.6.1 contains API changes but MANY NUnit tests uses old, Obsolete version of the API. So the documentation is not up-to-date nor the tests.
I think, the team shouldn’t change the API without changing the unit tests to use that new API and thus providing us a solution how to migrate from old version to the new version.
Anyway, StructureMap is really nice library with many very useful features, going hand in the hand with TDD, Mocking, Plugins, etc. and the biggest advantage is the implementation of Convention over Configuration approach which is unique!
I hope Jeremy will have more free time to blog more about the newest version.