Ok, so I just posted less than an hour ago, but now I've found something worth talking about. :)
After working my way through Phil Haack's blog on TDD with DI using StructureMap, I found a few things that I thought may be helpful.
Firstly, don't try to use a LINQ to SQL data context as your concrete implementation of an interface. Apparently that doesn't work. :) I tried this and received a StructureMapException:
StructureMap Exception Code: 155 - An exception occurred while trying to create an InstanceFactory for PluginType MvcApplication.Models.IPostRepository,MvcApplication
The inner exception was:
StructureMap Exception Code: 200 - Could not find an InstanceMemento for the requested InstanceKey "LINQToSQL" of of PluginFamily MvcApplication.Models.IPostRepositor
Nasty... As soon as I swapped in a concrete implementation called PostRepository that simply called the methods I had created on top of the data context, everything worked.
Secondly, following the code for the StructureMapControllerFactory object will lead to a compile error because you need to specify a return type from the ObjectFactory.GetNamedInstance method. I used the generic version because I'm too lazy cast now days. That makes the code inside the try block:
return ObjectFactory.GetNamedInstance<IController>(controllerType.Name);
Lastly, if you want to use code instead of a configuration file for the StructureMap configuration, add the following to your Global.asax Application_Start event handler:
StructureMapConfiguration.UseDefaultStructureMapConfigFile = false;
StructureMapConfiguration.BuildInstancesOf<IPostRepository>()
.TheDefaultIsConcreteType<InMemoryPostRepository>;
StructureMapConfiguration.BuildInstancesOf<IController>()
.TheDefaultIsConcreteType<BlogController>;
So now I have a functional website that uses DI and is unit testable. Hope this helps someone else out there...