ASP.NET Core Web API InvalidOperationException:无法解析服务 [重复]

Posted

技术标签:

【中文标题】ASP.NET Core Web API InvalidOperationException:无法解析服务 [重复]【英文标题】:ASP.NET Core Web API InvalidOperationException: Unable to resolve service [duplicate] 【发布时间】:2020-06-29 16:43:24 【问题描述】:

我正在尝试构建一个简单的 api 作为对项目未来 api 的测试。但我一直有这个错误

InvalidOperationException:无法解析服务类型 尝试激活时出现“AspnetCore_WebApi.Models.TarefaContext” 'AspnetCore_WebApi.Models.TarefaRepositorio'。

这里是 TarefaContext.cs

using Microsoft.EntityFrameworkCore;
namespace AspnetCore_WebApi.Models

    public class TarefaContext : DbContext
    
        public TarefaContext(DbContextOptions<TarefaContext> options)
            : base(options)
         
        public DbSet<TarefaItem> TarefaItens  get; set; 
    

TarefaRepositorio.cs

using System.Collections.Generic;
using System.Linq;
namespace AspnetCore_WebApi.Models

    public class TarefaRepositorio : ITarefaRepositorio
    
        private readonly TarefaContext _context;
        public TarefaRepositorio(TarefaContext context)
        
            _context = context;
            Add(new TarefaItem  Nome = "Item1" );
        
        public IEnumerable<TarefaItem> GetAll()
        
            return _context.TarefaItens.ToList();
        
        public void Add(TarefaItem item)
        
            _context.TarefaItens.Add(item);
            _context.SaveChanges();
        
        public TarefaItem Find(long key)
        
            return _context.TarefaItens.FirstOrDefault(t => t.Chave == key);
        
        public void Remove(long key)
        
            var entity = _context.TarefaItens.First(t => t.Chave == key);
            _context.TarefaItens.Remove(entity);
            _context.SaveChanges();
        
        public void Update(TarefaItem item)
        
            _context.TarefaItens.Update(item);
            _context.SaveChanges();
        
    

TarefaController.cs

using System.Collections.Generic;
using AspnetCore_WebApi.Models;
using Microsoft.AspNetCore.Mvc;
namespace AspnetCore_WebApi.Controllers

    [Route("api/[controller]")]
    public class TarefaController : Controller
    
        private readonly ITarefaRepositorio _tarefaRepositorio;
        public TarefaController(ITarefaRepositorio tarefaRepositorio)
        
            _tarefaRepositorio = tarefaRepositorio;
        
        [HttpGet]
        public IEnumerable<TarefaItem> GetAll()
        
            return _tarefaRepositorio.GetAll();
        

        [HttpGet("id", Name = "GetTarefa")]
        public IActionResult GetById(long id)
        
            var item = _tarefaRepositorio.Find(id);
            if (item == null)
            
                return NotFound();
            
            return new ObjectResult(item);
        

        [HttpPost]
        public IActionResult Create([FromBody] TarefaItem item)
        
            if (item == null)
            
                return BadRequest();
            
            _tarefaRepositorio.Add(item);
            return CreatedAtRoute("GetTarefa", new  id = item.Chave , item);
        
    

ITarefaRepositorio.cs

using System.Collections.Generic;
namespace AspnetCore_WebApi.Models

    public interface ITarefaRepositorio
    
        void Add(TarefaItem item);
        IEnumerable<TarefaItem> GetAll();
        TarefaItem Find(long key);
        void Remove(long key);
        void Update(TarefaItem item);
    

【问题讨论】:

IoC 容器(如ServiceProvider)的工作方式是,为了创建一种类型(控制器),它认为需要创建一个存储库。要创建存储库,它需要创建上下文。为此,必须在启动时使用ServiceCollection 注册每种类型。它告诉您TarefaContext 尚未注册。它不知道如何创建,因此无法创建存储库。所以TarefaContext 必须在启动时使用ServiceProvider 注册。 ***.com/a/40900520/1743997 @ScottHannen 谢谢!我没有强硬的那个。 【参考方案1】:

错误消息描述依赖注入无法解析您的 TarefaContext 类。您应该使用services.AddDbContext 方法在您的启动ConfigureServices 方法中注册您的数据库上下文。 有关详细信息,请参阅 Microsoft 文档:https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

【讨论】:

嘿,非常感谢!我忘了提到我正在使用内存中的 EF Core,所以我只是在其中更改了一些内容。【参考方案2】:

正如Scott 和Artis 在https://***.com/a/62643033/12934203 中所说,我还没有将我的上下文类添加到startup.cs 文件中。我在Artis 提到的文章中遇到了一些问题,因为我使用的是 EF Core InMemory,所以我必须添加

services.AddDbContext<TarefaContext>(options => options.UseInMemoryDatabase());

改为在 Startup.cs 中的 ConfigureServices

services.AddDbContext<TarefaContext>(options => options.UseSqlite("Data Source=someDB.db"));

感谢大家的帮助

【讨论】:

以上是关于ASP.NET Core Web API InvalidOperationException:无法解析服务 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API

Asp.Net Core 1.1 消费web api

使用 ASP.NET Core MVC 创建 Web API

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

使用 ASP.NET Core MVC 创建 Web API