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, wennIRequestService<FooRequest>
angefordert wirdBarRequestService
wird injiziert, wennIRequestService<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 funktioniertWie 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).
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. –