【问题标题】:An unhandled exception occurred while processing the request in ASP.NET Core dependency injection在 ASP.NET Core 依赖注入中处理请求时发生未处理的异常
【发布时间】:2022-11-12 11:57:44
【问题描述】:

我有一个 ASP.NET Core Web 应用程序,该应用程序中有一个接口,该接口从该接口继承了一个类。 我试图通过控制器构造函数中的依赖注入来使用接口,但我总是收到以下错误

处理请求时发生未处理的异常。 InvalidOperationException:无法解析类型的服务 'DependenceInjection_Dapper.Services.SendSMS' 同时试图 启用 'DependenceInjection_Dapper.Controllers.HomeController'。 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)

接口代码如下:

public interface IsmsSender
{
    string sendSms();
}

类代码如下:

public class SendSms : IsmsSender
{
    public string sendSms()
    {
        return "send sms";
    }
}

并在program.cs 文件中添加以下代码:

builder.Services.AddTransient<IsmsSender, SendSms>();

此外,控制器的制造商如下:

public class HomeController : Controller
{
    private readonly IsmsSender _smsSender;

    public HomeController(SendSms smsSender)
    {
        _smsSender = smsSender;
    }

    public IActionResult Index()
    {
        ViewBag.send = _smsSender.sendSms();
        return View();
    }
}

但是,我总是会出错。

我完全按照微软的文档操作,但是问题并没有解决。

【问题讨论】:

    标签: c# asp.net asp.net-core .net-6.0


    【解决方案1】:

    您正在注入具体类型而不是您注册的接口。改为这样做:

    public class HomeController : Controller
    {
        private readonly IsmsSender _smsSender;
    
        public HomeController(IsmsSender smsSender)
        {
            _smsSender = smsSender;
        }
    
        public IActionResult Index()
        {
            ViewBag.send = _smsSender.sendSms();
            return View();
        }
    }
    

    永远记住,对容器来说重要的是“注册类型”,而不是具体类型。

    可以注册具体类型本身,尽管这并不常见,并且当您已经有了抽象时不建议这样做:您希望依赖抽象而不是具体类来减少实现中的耦合并使其更具可测试性。

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      相关资源
      最近更新 更多