Bei konkreten Klassen und Schnittstellen entsprechen Namen haben, dass nichtStructureMap konkrete Klassen, deren Interface-Namen konfigurieren nicht
Harvester_JohnDeere_Parsley : AbstractMachine, IParsleyHarvester
Harvester_NewHolland_Sage : AbstractMachine, ISageHarvester
Harvester_Kubota_Rosemary : AbstractMachine, IRosemaryHarvester
übereinstimmen, wo die Schnittstellen haben eine gemeinsame Mutter
IParsleyHarvester : ISpiceHarvester
ISageHarvester : ISpiceHarvester
IRosemaryHarvester : ISpiceHarvester
wie StructureMap kann so konfiguriert sein, dass Instanzen von I ... Harvester in den Konstruktor zB injiziert werden können
public ParsleyField(IParsleyHarvester parsleyHarvester)
ohne jedes Paar einzeln in der Registrierung konfigurieren zu müssen? z.B.
For<ISageHarvester>().Use<Harvester_NewHolland_Sage>();
Ich habe versucht, Scannen
Scan(x =>
{
x.AssemblyContainingType<Harvester_Kubota_Rosemary>();
x.AddAllTypesOf<ISpiceHarvester>();
aber die I ... Harvester Schnittstellen kartiert nicht bekommen.
Danke!
bearbeiten:
Beide Antworten arbeiten. @ Jeroenhs hat den Vorteil, dass Wächterklauseln hinzugefügt werden können, um Klassen auszuschließen (aus welchen Gründen auch immer). Hier ist ein Beispiel basierend auf @ Macs Antwort auf this question.
public class HarvesterConvention : StructureMap.Graph.IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
// only interested in non abstract concrete types
if (type.IsAbstract || !type.IsClass)
return;
// Get interface
var interfaceType = type.GetInterface(
"I" + type.Name.Split('_').Last() + "Harvester");
if (interfaceType == null)
throw new ArgumentNullException(
"type",
type.Name+" should implement "+interfaceType);
// register (can use AddType overload method to create named types
registry.AddType(interfaceType, type);
}
}
Nutzung:
Scan(x =>
{
x.AssemblyContainingType<Harvester_Kubota_Rosemary>();
x.Convention<HarvesterConvention>();
x.AddAllTypesOf<ISpiceHarvester>();