如何向需要参数的AutoFac注册泛型类



AutoFac允许您使用builder.RegisterGeneric(Type type)注册泛型类,但它不接受用于构造的参数。该方法的描述甚至写道:

注册一个未参数化的geenric类型

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

目前我有这样的注册:

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

在注册时,我必须指定T的确切类型(在本例中为Class1)。我可以更通用地做吗,这样我就可以为任何T注册一个了?

这里记录了每一件事:https://autofaccn.readthedocs.io/en/latest/register/parameters.html

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

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

对于那些寻找多种T类型的人(比如我)。

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..
}

最新更新