尝试激活“ Api.ServicesBusiness.EquipoServices”时无法解析类型为“ Api.Repositories.UnitOfWork”的服务

时间:2019-07-22 17:51:03

标签: repository-pattern asp.net-core-webapi unit-of-work ef-core-2.2 unitofworkapplication

我想制作一个webapi,而我正尝试通过服务方式来实现它,我有一个通用的存储库,另一个2个存储库和一个工作单元,显然一切都很好,但是当我从邮递员那里运行并测试该webapi我遇到了错误:

InvalidOperationException: Unable to resolve service for type 'Api.Repository.Repositories.UnitOfWork' while attempting to activate 'Api.ServicesBusiness.Implementacion.EquipoServices'.
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, bool throwIfCallSiteNotFound)

这是我的dbcontect:

public class AppDbContext : DbContext
    {
        public AppDbContext()
        {
        }
        public AppDbContext(DbContextOptions<AppDbContext> option)  :base(option)
        {
        }
        public DbSet<Equipo> Equipos { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Server=(localdb)\\Express;Database=SoftballLeague;Trusted_Connection=True");
            }
        }
    }

这是我的通用存储库的接口:

 public interface IGenericRepository<T> where T : class
    {
        Task<T> AddAsyn(T t);
        Task<T> UpdateAsyn(T t, object key);
    }

这是我的通用存储库的实现:

 public class GenericRepository<T> : IGenericRepository<T> where T : class
    {
        private readonly AppDbContext _context;
        private readonly DbSet<T> _dbSet;

        public GenericRepository(AppDbContext context)
        {
            _context = context;
            _dbSet = _context.Set<T>();
        }

        public virtual async Task<T> AddAsyn(T t)
        {
            _dbSet.Add(t);
            await _context.SaveChangesAsync();
            return t;

        }

        public virtual async Task<T> UpdateAsyn(T t, object key)
        {
            if (t == null)
                return null;
            T exist = await _dbSet.FindAsync(key);
            if (exist != null)
            {
                _context.Entry(exist).CurrentValues.SetValues(t);
                await _context.SaveChangesAsync();
            }
            return exist;
        }
}

这是我的Equipo存储库的接口:

public interface IEquipoRepository:IGenericRepository<Team>
    {
        int GetAverageTeam(string name);
        int GetTeamHit(string name);
}

这是我的Equipo存储库的实现:

 public class EquipoRepository : GenericRepository<Team>, IEquipoRepository
    {
        private readonly AppDbContext dbContext;
        public EquipoRepository(AppDbContext context) : base(context)
        {
            this.dbContext = context;
        }

        public int GetAverageTeam(string name)
        {
            int teamAverage = 0;

            var resultAverage = this.dbContext.Equipos
                           //.SelectMany(bItem => bItem.)
                          .Where(equipo=>equipo.Nombre==name)
                          .SelectMany(equipo => equipo.jugadores)
                          .Average(jugador => jugador.Average);

            if (resultAverage.HasValue)
                teamAverage =Convert.ToInt32(Math.Round(resultAverage.Value));

            return teamAverage;
        }

        public int GetTeamHit(string name)
        {
            int resultTotal = 0;

            var result = this.dbContext.Equipos
                          //.SelectMany(bItem => bItem.)
                          .Where(equipo => equipo.Nombre == name)
                          .SelectMany(equipo => equipo.jugadores)
                          .Sum(jugador => jugador.Cant_Hits_Conectados);

            if (result.HasValue)
                resultTotal = result.Value;

            return resultTotal;
        }

}

这是我的工作单元的界面:

 public interface IUnitOfWork:IDisposable
    {
        Task Commit();
    }

这是我的工作单元的体现:

public class UnitOfWork : IUnitOfWork
    {
        private readonly AppDbContext _DbContext;

        private EquipoRepository equipoRepository ; 

        public UnitOfWork(AppDbContext dbContext)
        {
            this._DbContext = dbContext;
            this.equipoRepository = new EquipoRepository(this._DbContext);
        }

        public EquipoRepository GetEquipoRepository{
            get {
                    if(this.equipoRepository==null)
                        this.equipoRepository= new EquipoRepository(this._DbContext);
                return this.equipoRepository;
            }

        }

        public async Task Commit()
        {
            await this._DbContext.SaveChangesAsync();
        }

        public void Dispose()
        {
            this._DbContext.Dispose();
        }
    }

这是IEquipoServices服务接口的实现:

 public interface IEquipoServices
    {
        ICollection<EstadisticaEquipoModel>AveragePorEquipo(string name);

       int Total2bleConectados(string name);
}

以下是服务的实现EquipoServices,其中一个引发错误的消息是

public class EquipoServices : IEquipoServices
    {
        private readonly UnitOfWork unit;

        public EquipoServices(UnitOfWork unitOfWorkFactory)
        {
            this.unit = unitOfWorkFactory;
        }
        public ICollection<EstadisticaEquipoModel> AveragePorEquipo(string name)
        {
            var equipoAverage= this.unit.GetEquipoRepository.GetAverageEquipo(name);
            return equipoAverage;
        }

        public int AveragePorEquipo(string name)
        {
            var result = this.unit.GetEquipoRepository.GetEquipoTotal2bleConectados(name);
            return result;
        }
}

这是控制器,在这里我只是运行ListadoEquipos()方法:

    [Route("api/[controller]")]
    public class EquipoController : ControllerBase
    {
        private readonly IEquipoServices equipoService;
        private readonly IMapper _mapper;
        public EquipoController(IEquipoServices eqService, IMapper mapper)
        {
            this.equipoService = eqService;
            this._mapper = mapper;
        }

        [HttpGet("list")]
        public IEnumerable<string> ListadoEquipos()
        {
            return new string[] { "value1", "value2" };
        }
}

这是startup.cs文件中的配置:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("ConnectionString")));
            services.AddTransient<IUnitOfWork, UnitOfWork>();
            services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));
            services.AddSingleton<IEquipoServices, EquipoServices>();
            //services.AddScoped<IJu, JugadorService>();

            services.AddAutoMapper(typeof(Startup));

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

1 个答案:

答案 0 :(得分:0)

您注册了IUnitOfWork,但您正在注入UnitOfWork。服务集合不知道如何直接注入UnitOfWork

又长又短,请插入IUnitOfWork

private readonly IUnitOfWork unit;

public EquipoServices(IUnitOfWork unitOfWorkFactory)