簡體   English   中英

使用具體類作為Controller屬性.NET Core時獲取InvalidOperationException

[英]Getting an InvalidOperationException when using a concrete class as a Controller property .NET Core

當將MailService傳遞給控制器​​的構造函數時,我的應用程序拋出System.InvalidOperationException 但是,當我將其切換為接口時,它可以工作。 這是什么原因呢?

Startup.cs

services.AddScoped<IMailService, MailService>();

在我的Controller

private IMailService MailService { get; }

public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, MailService mailService)
{
    if (userManager == null)
        throw new ArgumentNullException(nameof(userManager));

    if (signInManager == null)
        throw new ArgumentNullException(nameof(signInManager));

    if (mailService == null)
        throw new ArgumentNullException(nameof(mailService));

    this.UserManager = userManager;
    this.SignInManager = signInManager;
    this.MailService= mailService;
}

非常感謝!

services.AddScoped<IMailService, MailService>();

因為那條線。 您要告訴DI服務在IMailService類型的構造函數中遇到參數時,將其注入構造函數中的MailService實例。

您沒有為注入(替換) MailService類型的實例定義任何內容。

您現在擁有的是好的做法,請不要更改它。 您希望在可能的情況下針對接口進行編程。 這也稱為基於接口的編程 ,有很多好處。


另請參見一個可能相關的問題: “對接口進行編程”是什么意思?

我也注意到了這一點。 回到我們使用Unity for DI時,即使您沒有專門將其添加到容器中,也可以通過解析您所請求的具體類來解決。

使用.NET Core依賴項注入,它要求您專門聲明要注入的服務。 即使它可以解決您的具體課程,但我猜這個決定是在開發過程中的某個時候做出的,需要這樣做。 因此,如果執行以下操作,您的代碼將起作用:

services.AddScoped<MailService>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM