-1

我想做一个 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);
        }
4

1 回答 1

0

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

长短,注入IUnitOfWork代替:

private readonly IUnitOfWork unit;

public EquipoServices(IUnitOfWork unitOfWorkFactory)
于 2019-07-22T18:18:05.653 回答