16

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.

3 Answers 3

31

You can specify a constructor with the ConstructedBy(). Please try this:

ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());

This worked for me.

Sign up to request clarification or add additional context in comments.

3 Comments

Updated SM 2.6 Syntax: For<MyDataContext>().Use(() => new MyDataContext());
It appears in SM 2.6.2 that the Use does not have any constructor arguments.
Tested in SM 2.6.4.1: For<IFoo>().Use(() => new Foo());
5

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.

Comments

0

I'm not sure how / if it can be done with the fluent interface / internal DSL. You can however use an attribute, if you're not fussed about polluting your domain?

Tag your preferred constructor with [DefaultConstructor] StructureMap defaults to the greediest constructor by convention (constructor with the most parameters).

2 Comments

Sorry Cik, I'd already typed (but not submitted) my response during your update.
No problem, my fault ;-) Thanks for your reply anyway ! The approach of annotating my DataContext (in creating a partial class) would be possible but I think that it looses from the benefit of using an IoC ...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.