Come definire un costruttore predefinito tramite codice usando StructureMap?

Non riesco a capire come definire il costruttore predefinito (quando esiste sovraccarico) per un tipo in StructureMap (versione 2.5) per codice.

Voglio ottenere un’istanza di un servizio e il contenitore deve iniettare un’istanza di contesto dati Linq2Sql in esso.

Ho scritto questo nel mio metodo ‘bootstrapper’:

ForRequestedType().TheDefault.Is.OfConcreteType(); 

Quando eseguo la mia app, ho ricevuto questo errore:

StructureMap Exception Code: 202
Nessuna istanza predefinita definita per PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

Se commento tutti i controli di Linq2Sql generati che non ho bisogno, funziona bene.

Aggiornamento: Oh, e ho dimenticato di dire che non avrei usato l’attributo [StructureMap.DefaultConstructor] .

È ansible specificare un costruttore con ConstructedBy (). Per favore prova questo:

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

Questo ha funzionato per me.

Suppongo che avresti anche bisogno di impostare la durata dell’object (InstanceScope) se stai usando Linq2Sql. Suggerirei di usare questo codice perché ti dà un po ‘più di flessibilità.

 ForRequestedType< MyDataContext >() .CacheBy( InstanceScope.PerRequest ) .TheDefault.Is.OfConcreteType< MyDataContext >() SelectConstructor< MyDataContext >( () => new MyDataContext()); 

Con questo codice è inoltre ansible iniettare ulteriori definizioni di interfacce nel costruttore MyDataContext come questo

 SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null )); 

Basta ricordare di definire il tipo concreto con StructureMap per l’istanza IDatabaseFactory.

Non sono sicuro di come / se può essere fatto con l’interfaccia fluente / DSL interno. Puoi comunque usare un attributo, se non ti preoccupi di inquinare il tuo dominio ?

Contrassegna il costruttore preferito con [DefaultConstructor] StructureMap imposta come predefinito il costruttore più avido per convenzione (costruttore con il maggior numero di parametri).