I can't figure out how to define the default constructor (when it exists overloads) for a type in StructureMap (version 2.5) by code.
I want to get an instance of a service and the container has to inject a Linq2Sql data context instance into it.
I wrote this in my 'bootstrapper' method :
ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();
When I run my app, I got this error :
StructureMap Exception Code: 202
No Default Instance defined for PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
If I comment out all Linq2Sql generated contructors that I don't need, it works fine.
Update : Oh, and I forgot to say that I would not use the [StructureMap.DefaultConstructor]
attribute.
You can specify a constructor with the ConstructedBy(). Please try this:
ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());
This worked for me.
I'm assuming you'd also need to set the object lifetime (InstanceScope) if you are using Linq2Sql. I'd suggest using this code because it give you a little more flexibility.
ForRequestedType< MyDataContext >()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType< MyDataContext >()
SelectConstructor< MyDataContext >( () => new MyDataContext());
With this code you can also further inject interfaces definitions into the MyDataContext constructor like this
SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null ));
Just remember to define the concrete type with StructureMap for your IDatabaseFactory instance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With