2010-11-22 5 views
1

StructureMapは、インターフェイス名が一致しない具体的なクラスを構成します。

Harvester_JohnDeere_Parsley : AbstractMachine, IParsleyHarvester 
Harvester_NewHolland_Sage : AbstractMachine, ISageHarvester 
Harvester_Kubota_Rosemary : AbstractMachine, IRosemaryHarvester 

IParsleyHarvester : ISpiceHarvester 
ISageHarvester : ISpiceHarvester 
IRosemaryHarvester : ISpiceHarvester 

どのようにStructureMapを設定して、I ... Harvesterのインスタンスを作成することができますか?例えばコンストラクタに注入される

public ParsleyField(IParsleyHarvester parsleyHarvester) 

各ペアを個別にレジストリに設定する必要はありませんか?例えば

For<ISageHarvester>().Use<Harvester_NewHolland_Sage>(); 

私は

Scan(x => 
{ 
    x.AssemblyContainingType<Harvester_Kubota_Rosemary>(); 
    x.AddAllTypesOf<ISpiceHarvester>(); 

をスキャンしようとしましたが、I ... Harvesterインターフェイスはマップされません。

ありがとう!

編集

両方の答えが働きます。 @ jeroenhには、(何らかの理由で)クラスを除外するためにガード句を追加できるという利点があります。ここでは、@ Macの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); 
    } 
} 

用法:

Scan(x => 
{ 
    x.AssemblyContainingType<Harvester_Kubota_Rosemary>(); 
    x.Convention<HarvesterConvention>(); 
    x.AddAllTypesOf<ISpiceHarvester>(); 

答えて

1

のStructureMapは自分の規約を知りません。カスタム登録規約を追加して、そのことを伝える必要があります。 IRegistrationConventionインタフェースを実装し、組立スキャナに規則を追加します。

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

私はthis questionにキルシュシュタインの回答@からソリューションを適応しました。

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

具体的なクラスの名前をルックアップの目的でインターフェイス名に変換する方法を定義します。

関連する問題