2008-11-14 2 views
15

Ich kann nicht herausfinden, wie Sie den Standardkonstruktor (wenn es Überladungen gibt) für einen Typ in StructureMap (Version 2.5) nach Code definieren.Wie definiert man einen Standardkonstruktor nach Code mit Hilfe von StructureMap?

Ich möchte eine Instanz eines Dienstes abrufen, und der Container muss eine Linq2Sql-Datenkontextinstanz in ihn einfügen.

schrieb ich in meinem 'Bootstrap' Methode:

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

Wenn ich meine app laufen, ich diesen Fehler habe:

StructureMap Ausnahmecode: 202
keine Standardinstanz definiert für PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = null

Wenn ich alle Linq2Sql-generierten Konstruktoren, die ich nicht brauche, auskommentiere, funktioniert es gut.

Update: Oh, und ich vergaß zu sagen, dass ich das Attribut [StructureMap.DefaultConstructor] nicht verwenden würde.

Antwort

30

Sie können mit ConstructedBy() einen Konstruktor angeben. Bitte versuchen Sie dies:

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

Das ist für mich gearbeitet.

+0

Vielen Dank, es hat auch hier funktioniert :-D! –

+23

Aktualisierte SM 2.6 Syntax: Für (). Verwenden Sie (() => new MyDataContext()); – mxmissile

+1

In SM 2.6.2 wird angezeigt, dass Use keine Konstruktorargumente enthält. –

0

Ich bin nicht sicher, wie/wenn es mit der fließenden Schnittstelle/internen DSL getan werden kann. Sie können jedoch ein Attribut verwenden, wenn Sie nicht über verschmutzen Ihre Domain verschmutzen?

Markieren Sie Ihren bevorzugten Konstruktor mit [DefaultConstructor] StructureMap verwendet standardmäßig den gierigsten Konstruktor (Konstruktor mit den meisten Parametern).

+0

Tut mir leid Cik, ich habe meine Antwort bereits während des Updates getippt (aber nicht gesendet). –

+0

Kein Problem, meine Schuld ;-) Danke für deine Antwort trotzdem! Der Ansatz, meinen DataContext zu kommentieren (um eine partielle Klasse zu erstellen) wäre möglich, aber ich denke, dass er vom Vorteil der Verwendung eines IoC ... –

5

Ich nehme an, Sie müssten auch die Lebensdauer des Objekts (InstanceScope) festlegen, wenn Sie Linq2Sql verwenden. Ich würde vorschlagen, diesen Code zu verwenden, weil es Ihnen etwas mehr Flexibilität gibt.

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

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

Mit diesem Code können Sie auch weitere Schnittstellen-Definitionen in den MyDataContext Konstruktor injizieren wie diese

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

Denken Sie daran, die konkrete Art mit StructureMap für Ihre IDatabaseFactory Instanz zu definieren.

Verwandte Themen