Domanda

Non riesco a capire come definire il costruttore predefinito (quando esiste un 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 del contesto di dati Linq2Sql in esso.

Ho scritto questo nel mio metodo "bootstrapper":

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();

Quando eseguo la mia app, viene visualizzato questo errore:

  

Codice di eccezione StructureMap: 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 contruttori generati da Linq2Sql di cui non ho bisogno, funziona bene.

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

È stato utile?

Soluzione

È possibile specificare un costruttore con ConstructedBy (). Prova questo:

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

Questo ha funzionato per me.

Altri suggerimenti

Suppongo che dovresti anche impostare la durata dell'oggetto (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 è anche possibile inserire ulteriori definizioni di interfacce nel costruttore MyDataContext in questo modo

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

Ricorda solo di definire il tipo concreto con StructureMap per la tua istanza IDatabaseFactory.

Non sono sicuro di come / se può essere fatto con l'interfaccia fluida / DSL interno. Puoi tuttavia utilizzare un attributo, se non ti preoccupi di inquinare il tuo dominio ?

Contrassegna il tuo costruttore preferito con [DefaultConstructor] per impostazione predefinita StructureMap è il costruttore più avido per convenzione (costruttore con il maggior numero di parametri).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top