开放通用的Autofac注册提供程序
本文关键字:注册 程序 Autofac | 更新日期: 2023-09-27 18:03:48
我有两个通用接口的实现。
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){}
}
我不知道如何为autoface注册开放通用服务的提供者。感谢任何帮助。
正如@Steven所说,我也不建议使用工厂。相反,您可以将IService<T>
注册为命名或关键服务,然后在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>>
来获得所有可用的实现,然后选择你喜欢的正确的服务