0

汎用インタフェースの実装は2つあります。オープン・ジェネリックの自動ファクシミリ・レジスタ・プロバイダ

public class ConcreteComponent1<T>:IService<T>{} 
public class ConcreteComponent2<T>:IService<T>{} 

私は適切な具体的な実装を作成する工場を持っています。

public class ServiceFactory 
{ 
    public IService<T> CreateService<T>() 
    { 
     //choose the right concrete component and create it 
    } 
} 

私は以下のサービス消費者を登録しており、サービスを利用します。

public class Consumer 
{ 
    public Consumer(IService<Token> token){}  
} 

オープンファーストサービスのプロバイダをautofacで登録する方法がわかりません。どんな助けもありがたい。前もって感謝します。

+1

"私は適切な具体的な実装を作成する工場を持っています。" [工場を使わないでください。それはコードのにおいです](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)。 – Steven

答えて

0

@Stevenも工場を利用することを勧めました。代わりに、あなたはあなたのIService<T>named or keyed serviceとして登録してから、使用したい実装Consumerクラスのコンストラクタで決めることができました:

containerBuilder.RegisterGeneric(typeof(ConcreteComponent1<>)).Named("ConcreteComponent1", typeof(IService<>)); 
containerBuilder.RegisterGeneric(typeof(ConcreteComponent2<>)).Named("ConcreteComponent2", typeof(IService<>)); 
containerBuilder.RegisterType<Consumer>(); 

次に、あなたがあなたのIService<T>クラスのすべての名前の実装を取得するためにIIndex<K,V>クラスを使用することができます。あなたのサービスに名前を付けたくない場合は

public class Consumer 
{ 
    private readonly IService<Token> _token; 

    public Consumer(IIndex<string, IService<Token>> tokenServices) 
    { 
     // select the correct service 
     _token = tokenServices["ConcreteComponent1"]; 
    } 
} 

代わりに、あなたはまた、IEnumerable<IService<Token>>を注入することによって、すべての利用可能な実装を取得し、あなたが好きしかし、正しいサービスを選択することができます。

関連する問題