0

我有兩個通用接口的實現。Autofac註冊提供程序的開放式通用

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

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

然後你可以使用IIndex<K,V>類讓你IService<T>類的所有命名的實現:

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>>得到所有可用的實現和你喜歡的,然後選擇正確的服務。