2010-11-22 4 views
1

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>(); 

Antwort

1

StructureMap nicht weiß, über Ihre Konvention. Sie müssen darüber informieren, indem Sie eine benutzerdefinierte Registrierungskonvention hinzufügen. Implementieren Sie die IRegistrationConvention Schnittstelle, und fügen Sie die Konvention zur Montage Scanner:

Scan(x => 
    { 
    x.Convention<MyConvention>(); 
    } 
1

ich eine Lösung von @ Kirschstein Antwort auf this question angepasst.

Scan(x => 
{ 
    x.AssemblyContainingType<Harvester_Kubota_Rosemary>(); 
    x.AddAllTypesOf<ISpiceHarvester>() 
    .NameBy(type => "I" + type.Name.Split('_').Last() + "Harvester"); 

Definiert die Möglichkeit, den Namen der konkreten Klasse in den Schnittstellennamen für Nachschlagzwecke umzuwandeln.

Verwandte Themen