Vinculando autofac com webapi usando repositório genérico
Estou tentando usar o autofac com um repositório e estou tentando adicionar um pouco de genéricos para tentar reduzir a quantidade de código duplicado que estou escrevendo.No entanto, estou girando em círculos tentando fazer com que o autofac funcione para mim
Então, eu criei um serviço de domínio e interface que lida com nossas operações padrão de crud
public class DomainService<T>:IDomainService<T>
{
protected readonly IDomainService<T> Repository;
public DomainService(IDomainService<T> repository)
{
Repository = repository;
}
public IQueryable<T> GetQueryable()
{
return Repository.GetQueryable();
}
public virtual Task<T> Add(T entity)
{
return Repository.Add(entity);
}
Interface:
public interface IDomainService<T>
{
IQueryable<T> GetQueryable();
Task<T> Add(T entity);
Task<bool> Delete(T entity);
Task<T> Update(T entity);
Task<T> GetById(int id);
Task<T> GetByUID(Guid id);
}
Estou usando meu repositório não é nada de especial
public class SkillRepository : DomainService<Skill>, ISkill
{
private DataContext _db = new DataContext();
private readonly ILogger _log = null;
public SkillRepository(IDomainService<Skill> repository, ILogger log) : base(repository)
{
_log = log;
}
}
Finalmente, onde conecto o autofac:
var builder = new ContainerBuilder();
// Register the Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Register other dependencies.
builder.Register(c => new Logger()).As<ILogger>().InstancePerApiRequest();
builder.RegisterType<SkillRepository>()
.As<IDomainService<Skill>>()
.As<ISkill>()
.InstancePerRequest();
// Build the container.
var container = builder.Build();
// Create the depenedency resolver.
var resolver = new AutofacWebApiDependencyResolver(container);
// Configure Web API with the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
Meu controlador de API da Web parece
public class SkillsController : BaseController<Skill>
{
private readonly ISkill _skillRepository;
public SkillsController(SkillRepository skillRepository) : base(skillRepository)
{
_skillRepository = skillRepository;
}
}
BaseController
public abstract class BaseController<TEntity> : ApiController
where TEntity : new()
{
protected readonly IDomainService<TEntity> DomainService;
protected BaseController(IDomainService<TEntity> domainService)
{
DomainService = domainService;
}
Eu recebo uma exceção:
"Nenhum dos construtores encontrados com 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' no tipo 'Api.EndPoints.Skills.SkillsController' pode ser chamado com os serviços e parâmetros disponíveis: \ \ Não é possível resolver o parâmetro 'Domain.Repository.SkillRepository skillRepository 'do construtor' Void .ctor (Domain.Repository.SkillRepository) '. "
Existe algo óbvio que estou fazendo errado?