我有一個 ASP.NET Core Web 應用程式,該應用程式中有一個介面,該介面從該介面繼承了一個類。我試圖通過控制器建構式中的依賴注入來使用介面,但我總是收到以下錯誤
處理請求時發生未處理的例外。InvalidOperationException:嘗試激活“DependenceInjection_Dapper.Controllers.HomeController”時無法決議“DependenceInjection_Dapper.Services.SendSMS”型別的服務。Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,型別型別,型別 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();
}
}
但是,我總是得到一個錯誤。
我的行為完全按照 Microsoft 檔案進行,但問題沒有解決。
uj5u.com熱心網友回復:
您正在注入具體型別而不是您注冊的介面。改為這樣做:
public class HomeController : Controller
{
private readonly IsmsSender _smsSender;
public HomeController(IsmsSender smsSender)
{
_smsSender = smsSender;
}
public IActionResult Index()
{
ViewBag.send = _smsSender.sendSms();
return View();
}
}
永遠記住,對容器來說重要的是“注冊型別”,而不是具體型別。這行說什么:
builder.Services.AddTransient<IsmsSender, SendSms>();
基本上是:
每當有人要求時
IsmsSender,給他們一個SendSms實體
沒有說消費者要求SendSms。
可以注冊具體型別本身,盡管這并不常見,并且當您已經有了抽象時不建議這樣做:您希望依賴抽象而不是具體類來減少實作中的耦合并使其更具可測驗性。
要注冊具體類本身,您只需省略第一個泛型引數:
builder.Services.AddTransient<SendSms>();
現在這意味著人們必須SendSms直接要求,并且IsmsSender不再可以解決。
uj5u.com熱心網友回復:
問題來自您的建構式
公共 HomeController( SendSms smsSender) { _smsSender = smsSender; }
應該
public HomeController(ISendSms smsSender)
{
_smsSender = smsSender;
}
您在依賴注入階段將您的 ISmendSms 注冊為 Sendsms。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532849.html
上一篇:將空白字符注入變數
