gpt4 book ai didi

c# - 使用通用存储库将 autofac 与 webapi 绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 14:55:03 25 4
gpt4 key购买 nike

我正在尝试将 autofac 与存储库一起使用,并且我正在尝试添加一些泛型来尝试减少我正在编写的重复代码的数量。但是我正在绕圈子试图让 autofac 为我工作

所以我创建了一个域服务和接口(interface)来处理我们的标准 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);
}

我正在使用我的 repo 没什么特别的

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

最后是我连接 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;

我的 web api Controller 看起来像

public class SkillsController : BaseController<Skill>
{
private readonly ISkill _skillRepository;

public SkillsController(SkillRepository skillRepository) : base(skillRepository)
{
_skillRepository = skillRepository;
}
}

基础 Controller

public abstract class BaseController<TEntity> : ApiController
where TEntity : new()
{
protected readonly IDomainService<TEntity> DomainService;

protected BaseController(IDomainService<TEntity> domainService)
{
DomainService = domainService;
}

我得到一个异常(exception):

"None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Api.EndPoints.Skills.SkillsController' can be invoked with the available services and parameters:\ \ Cannot resolve parameter 'Domain.Repository.SkillRepository skillRepository' of constructor 'Void .ctor(Domain.Repository.SkillRepository)'."

有什么明显的地方我做错了吗?

最佳答案

它无法解析依赖关系,因为它正在寻找具体类型,但您从未注册过 SkillsRepository那样。现在您可以更改注册以注册具体类型,但这不是最佳方法。

更好的方法是将 SkillsRepository 注册为其接口(interface):

builder.RegisterType<SkillRepository>()
.As<ISkillsRepository>()
.InstancePerRequest();

并定义ISkillsRepository继承所有其他接口(interface),如 ISkill你要的那个。

public interface ISkillsRepository : ISkill, IDomainService<Skill> { }

不要将对象注册为具体类型,也不要依赖构造函数中的具体类型。

  public SkillsController(ISkillRepository skillRepository) : 
base(skillRepository) ...

如果您使用具体类型作为依赖项,您将创建无法使用模拟框架进行测试的类。

您对 SkillRepository : DomainService<Skill>, ISkill 的使用也很费解为什么它既是技能又是技能的领域服务?没有多大意义。

关于c# - 使用通用存储库将 autofac 与 webapi 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com