2008-11-14 11 views
15

Je n'arrive pas à comprendre comment définir le constructeur par défaut (lorsqu'il existe des surcharges) pour un type dans StructureMap (version 2.5) par code.Comment définir un constructeur par défaut par code en utilisant StructureMap?

Je veux obtenir une instance d'un service et le conteneur doit injecter une instance de contexte de données de Linq2Sql en elle.

j'ai écrit dans ma méthode 'bootstrapper':

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

Quand je lance mon application, je suis arrivé cette erreur:

StructureMap Code d'exception: 202
Aucune instance par défaut défini pour PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null

Si je commente tous les contructeurs générés par Linq2Sql dont je n'ai pas besoin, cela fonctionne bien.

Mise à jour: Oh, et j'ai oublié de dire que je ne voudrais pas utiliser l'attribut [StructureMap.DefaultConstructor].

Répondre

30

Vous pouvez spécifier un constructeur avec le ConstructedBy(). S'il vous plaît essayez ceci:

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

Cela a fonctionné pour moi.

+0

Merci beaucoup, ça a fonctionné ici aussi :-D! –

+23

Mise à jour SM 2.6 Syntaxe: Pour (). Utiliser (() => new MyDataContext()); – mxmissile

+1

Il apparaît dans SM 2.6.2 que l'utilisation n'a aucun argument constructeur. –

0

Je ne suis pas sûr de savoir comment/si elle peut être fait avec l'interface fluide/DSL interne. Vous pouvez cependant utiliser un attribut si vous n'êtes pas fâché à propos de polluant votre domaine?

Tag votre constructeur préféré avec [DefaultConstructor] par défaut StructureMap au constructeur par convention cupide (constructeur avec le plus de paramètres).

+0

Désolé Cik, j'avais déjà tapé (mais pas soumis) ma réponse lors de votre mise à jour. –

+0

Aucun problème, ma faute ;-) Merci pour votre réponse de toute façon! L'approche de l'annotation de mon DataContext (en créant une classe partielle) serait possible mais je pense que ça perd de l'avantage d'utiliser un IoC ... –

5

Je suppose que vous auriez besoin aussi de définir la durée de vie de l'objet (InstanceScope) si vous utilisez Linq2Sql. Je suggère d'utiliser ce code parce qu'il vous donne un peu plus de flexibilité.

ForRequestedType<MyDataContext>() 
      .CacheBy(InstanceScope.PerRequest) 
      .TheDefault.Is.OfConcreteType<MyDataContext>() 

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

Avec ce code, vous pouvez également injecter davantage de définitions d'interfaces dans le constructeur MyDataContext comme celui-ci

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

Rappelez-vous simplement de définir pour votre instance IDatabaseFactory le type de béton avec StructureMap.