如何解决ASP.NET Core 依赖注入错误:尝试激活时无法解析服务类型
要分解错误消息:
尝试激活“WebApplication1.Controllers.BlogController”时无法解析“WebApplication1.Data.BloggerRepository”类型的服务。
也就是说,您的应用程序正在尝试创建一个实例,BlogController
但它不知道 如何
创建一个实例BloggerRepository
以传递给构造函数。
现在看看你的启动:
services.AddScoped<IBloggerRepository, BloggerRepository>();
也就是说,每当需要 aIBloggerRepository
时,创建 aBloggerRepository
并将其传入。
但是,您的控制器类正在请求具体类BloggerRepository
,而依赖注入容器在直接请求时不知道该怎么做。
我猜你只是打错了,但一个相当常见的。因此,简单的解决方法是更改您的控制器以接受 DI 容器 确实 知道如何处理的内容,在这种情况下,接口:
public BlogController(IBloggerRepository repository)
// ^
// Add this!
{
_repository = repository;
}
请注意,某些对象有自己的自定义注册方式,这在您使用外部 Nuget 包时更为常见,因此阅读它们的文档是值得的。例如,如果您收到一条消息说:
无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务…
然后,您将使用该库提供的自定义扩展方法来解决该问题,该方法将是:
services.AddHttpContextAccessor();
对于其他包 - 始终阅读文档。
解决方法
我创建了一个 .NET Core MVC 应用程序并使用依赖注入和存储库模式将存储库注入到我的控制器。但是,我收到一个错误:
InvalidOperationException:尝试激活“WebApplication1.Controllers.BlogController”时无法解析“WebApplication1.Data.BloggerRepository”类型的服务。
模型 (Blog.cs)
namespace WebApplication1.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
}
DbContext (BloggingContext.cs)
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
}
存储库(IBloggerRepository.cs 和 BloggerRepository.cs)
using System;
using System.Collections.Generic;
using WebApplication1.Models;
namespace WebApplication1.Data
{
internal interface IBloggerRepository : IDisposable
{
IEnumerable<Blog> GetBlogs();
void InsertBlog(Blog blog);
void Save();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggerRepository : IBloggerRepository
{
private readonly BloggingContext _context;
public BloggerRepository(BloggingContext context)
{
_context = context;
}
public IEnumerable<Blog> GetBlogs()
{
return _context.Blogs.ToList();
}
public void InsertBlog(Blog blog)
{
_context.Blogs.Add(blog);
}
public void Save()
{
_context.SaveChanges();
}
private bool _disposed;
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_context.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Startup.cs(相关代码)
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<IBloggerRepository,BloggerRepository>();
services.AddMvc();
// Add application services.
services.AddTransient<IEmailSender,AuthMessageSender>();
services.AddTransient<ISmsSender,AuthMessageSender>();
}
控制器 (BlogController.cs)
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Data;
using WebApplication1.Models;
namespace WebApplication1.Controllers
{
public class BlogController : Controller
{
private readonly IBloggerRepository _repository;
public BlogController(BloggerRepository repository)
{
_repository = repository;
}
public IActionResult Index()
{
return View(_repository.GetBlogs().ToList());
}
public IActionResult Create()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
_repository.InsertBlog(blog);
_repository.Save();
return RedirectToAction("Index");
}
return View(blog);
}
}
}
我不确定我做错了什么。有任何想法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。