开放通用的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注册开放通用服务的提供者。感谢任何帮助。

开放通用的Autofac注册提供程序

正如@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>>来获得所有可用的实现,然后选择你喜欢的正确的服务