如何在需要参数的AutoFac中注册通用类?

时间:2019-02-07 11:08:45

标签: c# inversion-of-control autofac ioc-container

AutoFac允许您向builder.RegisterGeneric(Type type)注册通用类,但是它不接受用于构造的参数。该方法的说明甚至说:

  

注册未参数化的字母类型

但是,如果我有一个由Service实现的通用接口IService,它需要一些参数怎么办?

目前,我已将其注册为:

builder.Register(c =>
    new Service<Class1>(
        parameter1,
        parameter2))
    .As<IService<Class1>>();

在注册中,我必须指定T的确切类型(在这种情况下为Class1)。我可以更笼统地做到这一点,这样我就有一个注册可以适用于任何T吗?

2 个答案:

答案 0 :(得分:3)

此处记录了所有内容:https://autofaccn.readthedocs.io/en/latest/register/parameters.html

基本上,您可以继续使用RegisterGeneric并使用WithParameter

builder.RegisterGeneric(typeof(Service<>))
       .WithParameter("nameOfParam1", parameter1)
       .WithParameter("nameOfParam2", parameter2)
       .As(typeof(IService<>));

答案 1 :(得分:0)

对于那些正在寻找多个Ttype的人(例如我)。

builder.RegisterGeneric(typeof(BaseGeneralCrud<,,>)).As(typeof(IBaseGeneralCrud<,,>)).InstancePerLifetimeScope();

这是类定义,如下所示:

public class BaseGeneralCrud<TEntity, TDto, TIdType> : IBaseGeneralCrud<TEntity,TDto,TIdType> 
        where TEntity : class, IHasIdColumn<TIdType>
        where TDto : IHasIdColumn<TIdType> , new()
        where TIdType : notnull 
{
    private readonly IRepository<TEntity,TIdType> _repository;

    private readonly IMapper _mapper;

    public BaseGeneralCrud(IRepository<TEntity,TIdType> repository, IMapper mapper)
    {
        _repository = repository;
        _mapper = mapper;
    }

    // there are some methods defined here..

}