2009-08-21 10 views
2

HochrangigenStrukturkarte Allgemeintyp Scanner

Mit StructureMap, Kann ich eine Montage Scan Regel definieren, dass für eine Schnittstelle IRequestService<T> das Objekt mit dem Namen TRequestService

Beispiele zurück:

  • FooRequestService wird injiziert, wenn IRequestService<FooRequest> angefordert wird
  • BarRequestService wird injiziert, wenn IRequestService<BarRequest> ist

Beschreibung requested

ich eine generische Schnittstelle

public interface IRequestService<T> where T : Request 
{ 
    Response TransformRequest(T request, User current); 
} 

definiert haben und dann mehrere Antrag Objekte Ich habe, die diese Schnittstelle

public class FooRequestService : IRequestService<Foo> 
{ 
    public Response TransformRequest(Foo request, User current) { ... } 
} 

public class BarRequestService : IRequestService<Bar> 
{ 
    public Response TransformRequest(Bar request, User current) { ... } 
} 

Jetzt realisiere ich bin an dem Punkt, wo ich diese Klassen registrieren muss, damit tha t StructureMap weiß, wie sie zu schaffen, weil in meinem Controller Ich habe möchte folgendes Ctor (was ich StructureMap will eine FooRequestService in injizieren)

public MyController(IRequestService<Foo> fooRequestService) { ... } 

Gerade jetzt um mein Problem zu erhalten habe ich eine leere Schnittstelle implementiert und stattdessen die mit den FooRequestService die generischen Schnittstelle implementieren ich habe es diese leere Schnittstelle

public interface IFooRequestService : IRequestService<Foo> { } 

Dann mein Controller ctor sieht so aus, implementieren, die

01 mit StructureMaps' Default Convention Scanner funktioniert

Wie kann ich eine Regel mit dem Assembly-Scanner von StructureMap erstellen, um alle Objekte namens TRequestService mit IRequestService<T> zu registrieren (wobei T = "Foo", "Bar" usw.), damit ich diese leeren Schnittstellendefinitionen nicht erstellen muss?

Um etwas anderes in den Mix zu werfen, wo ich StructureMap Assembly scannen habe, hat keine Referenz auf die Baugruppe, die IRequestService<T> definiert, so dass dies eine Art von Reflexion verwenden muss, wenn Sie dies tun. Ich habe die Antwort auf "StructureMap Auto registration for generic types using Scan" gescannt, aber es scheint, als ob diese Antwort einen Verweis auf die Assembly erfordert, die die Schnittstellendefinition enthält.

Ich bin auf dem Weg zu versuchen, eine benutzerdefinierte StructureMap.Graph.ITypeScanner schreiben, aber ich bin irgendwie fest, was ich dort tun (vor allem, weil ich wenig Erfahrung mit der Reflexion habe).

Antwort

2

Sie sind mit dem Scanner auf dem richtigen Weg. Zum Glück ist in StructureMap eine eingebaut. Leider ist es noch nicht, wie von diesem Schreiben, freigegeben. Holen Sie sich das Neueste aus dem Kofferraum und Sie werden ein paar neue Dinge in der Scannerkonfiguration sehen. Ein Beispiel für Ihre Bedürfnisse ist unten.

public class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     Scan(x => 
     { 
      x.TheCallingAssembly(); 
      //x.AssembliesFromApplicationBaseDirectory(); 
      x.WithDefaultConventions(); 
      x.ConnectImplementationsToTypesClosing(typeof (IRequestService<>)); 
     }); 
    } 
} 

Zuerst müssen Sie der Scannerkonfiguration mitteilen, welche Baugruppen in den Scan einbezogen werden sollen.Die kommentierte Methode AssembliesFromApplicationBaseDirectory() kann auch hilfreich sein, wenn Sie keine Registrierung pro Assembly ausführen.

Um Ihre generischen Typen in den Container zu bekommen, verwenden Sie ConnectImplementationsToTypesClosing.

Für ein Beispiel dafür, wie die Verwendung Register Setup, wenn der Behälter der Einrichtung sehen: http://structuremap.sourceforge.net/ConfiguringStructureMap.htm

Wenn Sie möchten, können Sie mit Registern im Allgemeinen überspringen und einfach eine Scan innerhalb ObjectFactory.Initialize.

Hoffe, das hilft.

+0

danke. Ich werde mir das ansehen. Zur Zeit verwende ich einen Assembly-Scanner und nur eine Registry über alle Lösungen (es gibt nur ein Projekt in meiner Lösung mit einem Verweis auf StructureMap). Ein Problem, das ich habe, ist, dass es eine generische Schnittstelle und mehrere Impl dieser Schnittstelle in meinem UI-Projekt gibt, aber ich kann das UI-Projekt nicht innerhalb des Projekts mit der Registrierung referenzieren, da dies einen Zirkelverweis verursachen würde, weshalb ich es bin in der Hoffnung, einen Scanner verwenden zu können. –