1

In der aktuellen Anwendung, an der ich arbeite, habe ich eine benutzerdefinierte ControllerFactory-Klasse, die einen Controller erstellt und automatisch Elmah ErrorHandler setzt.Wie verwendet man StructureMap, um Repository-Klassen in den Controller zu injizieren?

Ich möchte StructureMap verwenden, um Code in meine Controller zu injizieren. Zum Beispiel würde ich gerne Repository-Klassen in sie injizieren.

ich habe bereits meine Repository-Klassen, und ich habe auch einen Konstruktor an die Steuerung, die der Repository Klasse

public FirmController(IContactRepository contactRepository) { 
    _contactRepository = contactRepository; 
} 

Ich habe dann registrierte die Art innerhalb StructureMap

ObjectFactory.Initialize(x => { 
    x.For<IContactRepository>().Use<MyContactRepository>(); 
}); 

Wie soll erhalten hinzugefügt Ich ändere den Code in der CreateController-Methode, um die IContactRepository konkrete Klasse in die FirmController injiziert zu haben?

EDIT:

Ich habe die BaseControllerFactory geändert Structuremap zu verwenden. Aber ich bekomme eine Ausnahme auf der Linie

Irgendwelche Hinweise?

+1

Was ist der Fehler, den Sie bekommen? Rufen Sie Ihren Initialisierungscode in app_start auf, bevor Sie die benutzerdefinierte Controller-Factory festlegen? I.E. StaticClass.InitializeStructureMap(); Dann ControllerBuilder.Current.SetControllerFactory (new BaseControllerFactory()); – Paul

+0

Guter Fang. Ich habe den Initialisierungscode aufgerufen, nachdem ich die benutzerdefinierte Controller-Fabrik eingestellt hatte. – Lorenzo

Antwort

5

Bevor in der Lösung eingeben, würde ich empfehlen, die Container Typ mit SM zu initialisieren, anstatt Object

Der beste Weg, dies zu tun wäre, eine Klasse aus der Registry-Klasse in StructureMap Rahmen subclassed zu haben. Also, meine Registrierung wäre so etwas wie

public class MyAppRegistry : Registry 
{ 
    public MyAppRegistry() 
    { 
     For<IContactRepository>().Use<MyContactRepository>(); 
    } 
} 

und dann sagen Sie SM, diese Registrierung während der Konfiguration zu verwenden.

var container = new Container(x=>x.AddRegistry(new MyAppRegistry()); 

Dies würde von der Application_Start in der Global.asax erfolgen. Setzen Sie nach der obigen Zeile den ControllerBuilder in mvc, um die BaseControllerFactory zu verwenden. Jetzt sollte SM in der Lage sein, alle Abhängigkeiten aufzulösen

+0

Danke für Ihre Antwort. Gibt es einen Unterschied zwischen der Verwendung eines Containers und der Methode "ObjectFactory.Initialize"? Ich habe den Code leicht modifiziert und ich benutze tatsächlich die Initialize-Methode mit der AddRecistry innerhalb .. – Lorenzo

+0

Entschuldigung, ich meinte 'AddRegistry()' – Lorenzo

+0

Sie sind herzlich willkommen Lorenzo! Die ObjectFactory ist nur ein statischer Wrapper um den Container herum. Wenn Sie also Initialize aufrufen, wird der ctor des Containers in Ihrem Initialisierungsausdruck übergeben. Eine andere Sache, die beachtet werden muss, ist, dass, wenn Initialize erneut in ObjectFactory aufgerufen wird, es alle vorherigen Registrierungen löschen würde. Bei einem Container ist es viel sauberer, da Sie Configure nur nach der anfänglichen Konfiguration aufrufen können, was zu den bestehenden Registrierungen hinzukommt. Viel Glück in Ihrem Projekt! – Hakeem

Verwandte Themen