Wie konfiguriere ich StructureMap für die Verwendung eines generischen Repositorys?

8

Ich habe eine Schnittstelle IGenericRepository<TEntity> where TEntity : IEntity und eine Implementierung GenericRepository<TEntity> where TEntity : Entity .

Ich versuche, eine bestimmte IGenericRepository<Section> mit StructureMap in eine Klasse zu injizieren:

%Vor%

Aber wenn ich versuche, ObjectFactory.GetInstance<IGenericRepository<Section>>(); zu verwenden, bekomme ich:

StructureMap-Ausnahmecode: 202 Keine Standardinstanz für PluginFamily System.Data.Common.DbConnection

definiert

Irgendwelche Ideen, warum das ist oder was ich falsch mache?

Vielen Dank im Voraus,

Simon

    
simonjreid 14.05.2010, 15:35
quelle

3 Antworten

3

Wie ist Ihr Konstruktor für GenericRepository<> ?

Es oder eine seiner Abhängigkeiten erwartet eine DbConnection , die SM nicht erstellen kann.

    
Andrew Bullock 14.05.2010, 16:11
quelle
8

Sie erhalten in Ihrem GenericRepository-Konstruktor eine DbConnection, die eine abstrakte Klasse ist, und konfigurieren SM nicht, um zu wissen, welche spezifische Klasse dafür verwendet werden sollte.

d. h .:

%Vor%     
eglasius 14.05.2010 16:23
quelle
4

Ich hatte genau dasselbe Problem:

Habe ein generisches Repository:

%Vor%

und eine konkrete Umsetzung:

%Vor%

was ich zur Laufzeit in den Konstruktor der Controller injizieren wollte, wo die TEntity das für diesen Controller relevante Modell wäre:

%Vor%

Der Controller würde dann das Repository "_repo" verwenden, um das Modell zu aktualisieren:

%Vor%

simonjreid der Antwort für mich: musste den ObjectContext zur StructureMap-Konfiguration hinzufügen (der Zweck des Repositorys war es, den von EntityFramework generierten Kontext, den ich MyContextWrapper nannte, zu schließen. Deshalb, weil das Repository von MyContextWrapper abhing hängt von ObjectContext ab):

%Vor%

Allerdings bekomme ich jetzt die StructureMap Runtime Exception:

  

StructureMap-Ausnahmecode: 205   Fehlende angeforderte Instanzeigenschaft "connectionString"

Nach dem Lesen eines Posts von Jeremy Miller Ein sanfter Quickstart (ganz unten) habe ich festgestellt, dass Sie was definieren können Argumente, die in den Konstruktor Ihrer registrierten Typen übergeben werden, dh ich musste die Verbindungszeichenfolge an den Konstruktor der MyCustomContext-Klasse übergeben (hier ist die vollständige Auflistung, wie ich die ObjectFactory initialisiere:

) %Vor%

Und BOOM! Jetzt kann mein Controller zur Laufzeit von StructureMap instanziiert werden und eine Instanz von IRepository ... happy days injizieren.

    
HellspawnDeveloper 06.10.2011 07:00
quelle