.NET 6 ...无法解析类型的服务
.NET 6 ... unable to resolve service for type
我在 VS 2022 中使用 NuGet 包:
Microsoft.EntityFrameworkCore.SQLServer
Microsoft.EntityFrameworkCore.Tools
连接到我的 SQL 服务器(一切正常),我的所有模型部分 classes 已生成。我添加了一个新控制器(添加新脚手架项)和 select“带视图的 MVC 控制器,使用 Entity Framework”。 Select 我的模型 class “Phonenumbertype” 我的数据上下文 class “JMSContext”(只是 web API 没有通过 Swagger 测试的前端)。我的控制器生成
namespace WebAppTest.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class PhonenumbertypesController : ControllerBase
{
// Error out with code generated:
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-6.0
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0
// Possible Solution
//
private readonly JMSContext _context;
public PhonenumbertypesController(JMSContext context)
{
_context = context;
}
// GET: api/Phonenumbertypes
[HttpGet]
public async Task<ActionResult<IEnumerable<Phonenumbertype>>> GetPhonenumbertypes()
{
return await _context.Phonenumbertypes.ToListAsync();
}
// GET: api/Phonenumbertypes/5
[HttpGet("{id}")]
public async Task<ActionResult<Phonenumbertype>> GetPhonenumbertype(short id)
{
var phonenumbertype = await _context.Phonenumbertypes.FindAsync(id);
if (phonenumbertype == null)
{
return NotFound();
}
return phonenumbertype;
}
// PUT: api/Phonenumbertypes/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> PutPhonenumbertype(short id, Phonenumbertype phonenumbertype)
{
if (id != phonenumbertype.PhtId)
{
return BadRequest();
}
_context.Entry(phonenumbertype).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!PhonenumbertypeExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/Phonenumbertypes
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<Phonenumbertype>> PostPhonenumbertype(Phonenumbertype phonenumbertype)
{
_context.Phonenumbertypes.Add(phonenumbertype);
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (PhonenumbertypeExists(phonenumbertype.PhtId))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtAction("GetPhonenumbertype", new { id = phonenumbertype.PhtId }, phonenumbertype);
}
// DELETE: api/Phonenumbertypes/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeletePhonenumbertype(short id)
{
var phonenumbertype = await _context.Phonenumbertypes.FindAsync(id);
if (phonenumbertype == null)
{
return NotFound();
}
_context.Phonenumbertypes.Remove(phonenumbertype);
await _context.SaveChangesAsync();
return NoContent();
}
private bool PhonenumbertypeExists(short id)
{
return _context.Phonenumbertypes.Any(e => e.PhtId == id);
}
}
}
I 运行 my web API,Swagger 启动,select my API(试用)并得到错误:响应状态为 500 和以下正文:
System.InvalidOperationException:尝试激活 'WebAppTest.Controllers.PhonenumbertypesController' 时无法解析类型 'WebAppTest.Models.JMSContext' 的服务。
在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired)
在 lambda_method9(Closure , IServiceProvider , Object[] ).....
这都是自动生成的代码,所以我的期望是它会起作用,我会从那里扩展我的代码...这只是一个基本测试。
通过删除控制器中所有自动生成的代码,它能够得到我想要的结果 class ...但是,我想弄清楚为什么自动生成的代码没有工作?
您需要像 this 一样解析 startup.cs class 中的 JMSContext class。
更多关于 Dependency injection in .NET
自动生成的代码假定您已经安装了依赖项注册。在你的情况下,你还没有添加 JMSContext
到依赖容器。
您需要将 JMSContext 添加到 DI
如果你使用的是启动文件,那么你可以
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<JMSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringKeyName_From_AppSettings.json"));
//----- rest of the code
}
如果您没有使用启动文件,那么在您的 Program.cs 文件中,在构建应用程序之前,您可以使用
builder.Services.AddDbContext<JMSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringKeyName_From_AppSettings.json"));
我在 VS 2022 中使用 NuGet 包:
Microsoft.EntityFrameworkCore.SQLServer Microsoft.EntityFrameworkCore.Tools
连接到我的 SQL 服务器(一切正常),我的所有模型部分 classes 已生成。我添加了一个新控制器(添加新脚手架项)和 select“带视图的 MVC 控制器,使用 Entity Framework”。 Select 我的模型 class “Phonenumbertype” 我的数据上下文 class “JMSContext”(只是 web API 没有通过 Swagger 测试的前端)。我的控制器生成
namespace WebAppTest.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class PhonenumbertypesController : ControllerBase
{
// Error out with code generated:
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-6.0
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0
// Possible Solution
//
private readonly JMSContext _context;
public PhonenumbertypesController(JMSContext context)
{
_context = context;
}
// GET: api/Phonenumbertypes
[HttpGet]
public async Task<ActionResult<IEnumerable<Phonenumbertype>>> GetPhonenumbertypes()
{
return await _context.Phonenumbertypes.ToListAsync();
}
// GET: api/Phonenumbertypes/5
[HttpGet("{id}")]
public async Task<ActionResult<Phonenumbertype>> GetPhonenumbertype(short id)
{
var phonenumbertype = await _context.Phonenumbertypes.FindAsync(id);
if (phonenumbertype == null)
{
return NotFound();
}
return phonenumbertype;
}
// PUT: api/Phonenumbertypes/5
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPut("{id}")]
public async Task<IActionResult> PutPhonenumbertype(short id, Phonenumbertype phonenumbertype)
{
if (id != phonenumbertype.PhtId)
{
return BadRequest();
}
_context.Entry(phonenumbertype).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!PhonenumbertypeExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/Phonenumbertypes
// To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
[HttpPost]
public async Task<ActionResult<Phonenumbertype>> PostPhonenumbertype(Phonenumbertype phonenumbertype)
{
_context.Phonenumbertypes.Add(phonenumbertype);
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateException)
{
if (PhonenumbertypeExists(phonenumbertype.PhtId))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtAction("GetPhonenumbertype", new { id = phonenumbertype.PhtId }, phonenumbertype);
}
// DELETE: api/Phonenumbertypes/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeletePhonenumbertype(short id)
{
var phonenumbertype = await _context.Phonenumbertypes.FindAsync(id);
if (phonenumbertype == null)
{
return NotFound();
}
_context.Phonenumbertypes.Remove(phonenumbertype);
await _context.SaveChangesAsync();
return NoContent();
}
private bool PhonenumbertypeExists(short id)
{
return _context.Phonenumbertypes.Any(e => e.PhtId == id);
}
}
}
I 运行 my web API,Swagger 启动,select my API(试用)并得到错误:响应状态为 500 和以下正文:
System.InvalidOperationException:尝试激活 'WebAppTest.Controllers.PhonenumbertypesController' 时无法解析类型 'WebAppTest.Models.JMSContext' 的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired) 在 lambda_method9(Closure , IServiceProvider , Object[] ).....
这都是自动生成的代码,所以我的期望是它会起作用,我会从那里扩展我的代码...这只是一个基本测试。
通过删除控制器中所有自动生成的代码,它能够得到我想要的结果 class ...但是,我想弄清楚为什么自动生成的代码没有工作?
您需要像 this 一样解析 startup.cs class 中的 JMSContext class。 更多关于 Dependency injection in .NET
自动生成的代码假定您已经安装了依赖项注册。在你的情况下,你还没有添加 JMSContext
到依赖容器。
您需要将 JMSContext 添加到 DI
如果你使用的是启动文件,那么你可以
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<JMSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringKeyName_From_AppSettings.json"));
//----- rest of the code
}
如果您没有使用启动文件,那么在您的 Program.cs 文件中,在构建应用程序之前,您可以使用
builder.Services.AddDbContext<JMSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringKeyName_From_AppSettings.json"));