代码之家  ›  专栏  ›  技术社区  ›  sphcstrs

ASP。NET核心错误:系统。InvalidOperationException:尝试激活时无法解析类型的服务

  •  1
  • sphcstrs  · 技术社区  · 2 年前

    我关注这篇文章: https://code-maze.com/net-core-web-api-ef-core-code-first/ 使用设置我的后端。NET 6.0(他们在文章中使用了5)。

    我在Postman(尝试测试API)上遇到以下错误:

    系统InvalidOperationException:无法解析“codeFirstExample”类型的服务。模型。存储库。IDataRepository“1[codeFirstExample.Models.Employee]”正在尝试激活“codeFirstExample”。控制器。雇员控制员

    这是我的代码:

    型号(Employee.cs):

    namespace codeFirstExample.Models
    {
        public class Employee
        {
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public long EmployeeId { get; set; } 
            public string FirstName { get; set; } = string.Empty;
            public string LastName { get; set; } = string.Empty;
            public string PhoneNumber { get; set; } = string.Empty;
            public string Email { get; set; } = string.Empty;
        }
    }
    

    DbContext(EmployeeContext.cs):

    namespace codeFirstExample.Models
    {
        public class EmployeeContext : DbContext
        {
            private readonly IConfiguration Configuration;
    
            public EmployeeContext(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<EmployeeContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:EmployeeDB"]));
                services.AddScoped<IDataRepository<Employee>, EmployeeManager>();
                services.AddControllers();
            }
    
            protected override void OnConfiguring(DbContextOptionsBuilder options)
            {
                // connect to sql server with connection string from app settings
                options.UseSqlServer(Configuration.GetConnectionString("EmployeeDB"));
            }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Employee>().HasData(new Employee
                {
                    EmployeeId = 1,
                    FirstName = "Uncle",
                    LastName = "Bob",
                    Email = "uncle.bob@gmail.com",
                    PhoneNumber = "999-888-7777"
                }, new Employee
                {
                    EmployeeId = 2,
                    FirstName = "Jan",
                    LastName = "Kirsten",
                    Email = "jan.kirsten@gmail.com",
                    PhoneNumber = "111-222-3333"
                });
            }
    
            public DbSet<Employee> Employees => Set<Employee>();
    
    
        } 
    }
    

    存储库(IDataRepository.cs):

    namespace codeFirstExample.Models.Repository
    {
        public interface IDataRepository<TEntity>
        {
            IEnumerable<TEntity> GetAll();
            TEntity Get(long id);
            void Add(TEntity entity);
            void Update(TEntity dbEntity, TEntity entity);
            void Delete(TEntity entity);
        }
    }
    

    控制器(EmployeeController.cs):

    namespace codeFirstExample.Controllers
    {
        [Route("api/employee")]
        [ApiController]
        public class EmployeeController : ControllerBase
        {
            private readonly IDataRepository<Employee> _dataRepository;
            public EmployeeController(IDataRepository<Employee> dataRepository, EmployeeContext context)
            {
                _dataRepository = dataRepository;
            }
            // GET: api/Employee
            [HttpGet]
            public IActionResult Get()
            {
                IEnumerable<Employee> employees = _dataRepository.GetAll();
                return Ok(employees);
            }
            // GET: api/Employee/5
            [HttpGet("{id}", Name = "Get")]
            public IActionResult Get(int id)
            {
                Employee employee = _dataRepository.Get(id);
                if (employee == null)
                {
                    return NotFound("The Employee record couldn't be found.");
                }
                return Ok(employee);
            }
            // POST: api/Employee
            [HttpPost]
            public IActionResult Post([FromBody] Employee employee)
            {
                if (employee == null)
                {
                    return BadRequest("Employee is null.");
                }
                _dataRepository.Add(employee);
                return CreatedAtRoute(
                      "Get",
                      new { Id = employee.EmployeeId },
                      employee);
            }
            // PUT: api/Employee/5
            [HttpPut("{id}")]
            public IActionResult Put(int id, [FromBody] Employee employee)
            {
                if (employee == null)
                {
                    return BadRequest("Employee is null.");
                }
                Employee employeeToUpdate = _dataRepository.Get(id);
                if (employeeToUpdate == null)
                {
                    return NotFound("The Employee record couldn't be found.");
                }
                _dataRepository.Update(employeeToUpdate, employee);
                return NoContent();
            }
            // DELETE: api/Employee/5
            [HttpDelete("{id}")]
            public IActionResult Delete(int id)
            {
                Employee employee = _dataRepository.Get(id);
                if (employee == null)
                {
                    return NotFound("The Employee record couldn't be found.");
                }
                _dataRepository.Delete(employee);
                return NoContent();
            }
        }
    }
    

    我不确定出了什么问题,有人能帮我吗?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Lee    2 年前

    在启动中的ConfigureServices方法中添加服务。政务司司长如下:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<EmployeeContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:EmployeeDB"]));
        services.AddScoped<IDataRepository<Employee>, EmployeeManager>();
        services.AddControllers();
    }