当前位置: 首页 > 知识库问答 >
问题:

ASP. NET Core依赖注入错误:尝试激活时无法解析类型的服务

濮阳品
2023-03-14

我创建了一个。NET核心MVC应用程序,并使用依赖项注入和存储库模式将存储库注入控制器。但是,我得到一个错误:

无法解析类型WebApplication ation1的服务。数据。BloggerRepository'同时尝试激活'WebApplication 1.控制器。BlogController'.

型号(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

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);
        }
    }
}

启动。政务司司长(有关守则)

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);
        }
    }
}

我不确定我做错了什么。有什么想法吗?

共有3个答案

羊舌承
2023-03-14

在我的例子中,我试图为一个需要构造函数参数的对象进行依赖注入。在这种情况下,在启动期间,我只提供了配置文件中的参数,例如:

var config = Configuration.GetSection("subservice").Get<SubServiceConfig>();
services.AddScoped<ISubService>(provider => new SubService(config.value1, config.value2));
孙渝
2023-03-14

我遇到这个问题是因为在依赖项注入设置中,我缺少一个存储库的依赖项,该存储库是控制器的依赖项:

services.AddScoped<IDependencyOne, DependencyOne>();    <-- I was missing this line!
services.AddScoped<IDependencyTwoThatIsDependentOnDependencyOne, DependencyTwoThatIsDependentOnDependencyOne>();
长孙宜
2023-03-14

要分解错误消息,请执行以下操作:

无法解析类型WebApplication 1的服务。数据。BloggerRepository'同时尝试激活'WebApplication 1.控制器。BlogController'.

也就是说,您的应用程序正在尝试创建BlogController实例,但它不知道如何创建BloggerRepository的实例以传递到构造函数中。

现在看看你的创业公司:

services.AddScoped<IBloggerRepository, BloggerRepository>();

也就是说,每当需要IBloggerRepository时,创建一个BloggerRepository并将其传入。

但是,您的控制器类要求使用具体的类BloggerRepository,而依赖项注入容器在直接要求时不知道该做什么。

我猜你刚刚打错了,但很常见。因此,简单的修复方法是更改您的控制器以接受DI容器确实知道如何处理的东西,在本例中,是接口:

public BlogController(IBloggerRepository repository)
//                    ^
//                    Add this!
{
    _repository = repository;
}

请注意,有些对象有自己的自定义注册方式,这在使用外部Nuget包时更为常见,因此为它们阅读文档是值得的。例如,如果您收到一条消息说:

无法解析“Microsoft”类型的服务。AspNetCore。Http。IHttpContextAccessor'。。。

然后,您可以使用该库提供的自定义扩展方法来修复该问题,该方法将是:

services.AddHttpContextAccessor();

对于其他包-始终阅读文档。

 类似资料:
  • 我创建了一个.NETCoreMVC应用程序,并使用依赖注入和存储库模式将存储库注入我的控制器。然而,我得到一个错误: 无法解析类型WebApplication1.Data.BloggerRepository的服务,而试图激活WebApplication1.Controllers.BlogController。 存储 库: 控制器: 启动. cs: 我不知道我做错了什么。有什么想法吗?

  • 我正在尝试创建ASP。NET核心应用程序使用通用存储库模式,使用实体框架和服务层。然而,每当我启动项目时,都会遇到以下错误: 无法解析“GameSource”类型的服务。数据存储库。GameRepository“正在尝试激活”GameSource。服务。游戏服务'。 游戏控制器。反恐精英: 游戏服务。反恐精英: 游戏存储库。反恐精英: BaseRepository。反恐精英: GameSource

  • 在我的ASP. NET Core应用程序中,我收到以下错误: 无效操作异常:在尝试激活“城市”时无法解析类型“城市”的服务。模型。IRepository。控制器。HomeController。 我是家庭控制器,我试图将城市的getter传递给视图,如下所示: 我有一个文件存储库。cs包含一个接口及其实现,如下所示: 我的启动类包含从模板生成的默认代码。我做了任何更改:

  • 我正在创建viewcomponents,下面是我的全部代码。。但当我调用这个viewcomponent时,我得到如下错误。。所以,任何人都可以帮助我解决这个问题,并向我解释到底是什么问题。 错误是: InvalidOperationException:无法解析“Perfulmestore”类型的服务。数据模型。ShoppingCart正在尝试激活香水商店。视图组件。ShoppingCartSumm

  • 登录控制器中出现此错误。 无效操作异常:在尝试激活“汽车。服务器。控制器。AuthController”时,无法解析类型为“Microsoft. AspNetCore。身份。UserManager'1[汽车。模型。帐户]”的服务。 这是Auth Controller构造函数: 这里是启动中的ConfigureServices。反恐精英:

  • 我使用泛型使代码可重用,并利用依赖项注入。 我有两个接口:DataParserImplementation和ObjectImplementation。我有实现每个的类:SalesRepbyId实现DataParserImpl(它将数据解析为对象并将这些对象放入集合)。SalesRep实现Objectimpl(它是特定数据集的对象)。 我试图得到它,这样我就可以选择在我的SalesRepbyId类中