簡體   English   中英

無法使用 ASP.NET Core DI 注入委托

[英]Can't inject a delegate using ASP.NET Core DI

假設我有一個像這樣的 MVC 核心控制器:

public class SomeController
{
     public SomeController(IConfiguration appConfig, Func<string> someDelegate)
     {
     }
}

另外,我正在使用 AutoFac 來解決注射問題 對象注入工作完美無缺,同時添加委托注入會產生 ASP.NET Core 異常,該異常告訴Func<string>無法注入,因為沒有要注入此類類型的組件。

當我嘗試使用 AutoFac 手動解析SomeController我得到了所需的行為。

有沒有辦法在不使用 AutoFac 解析控制器的情況下支持這種情況?

默認情況下,控制器不通過 DI 解析,它們是在DefaultControllerFactory中構造的。

更新

Microsoft.Extensions.DependencyInjection不支持命名組件、發現、自動注冊、裝飾器等。

它意味着簡單的開箱即用 IoC 並為基本應用程序的 DI 提供基礎,並為集成 3rd 方 IoC 容器(具有自動發現、裝飾器等高級功能)提供簡單的方法(基本上他們所需要的只是處理IServiceCollection中的信息並從Configure方法返回他們自己的IServiceProvider實現)。

標簽助手、控制器和視圖組件在這方面有所不同,因為它們有自己的激活器(默認使用激活實用程序,在管道下游的某個點使用服務提供程序)。 出於這個原因, AddControllersAsServices存在,因為它將DefaultControllerActivator (使用 ActivationUtilities,請參閱DefaultControllerActivator.cs )替換為ServiceBasedActivator (使用IServiceProvider ,請參閱ServiceBasedControllerActivator )。

另請參閱此相關答案,了解有關如何通過 DI 解析控制器、標記助手和視圖組件的詳細信息。

var builder = services
    .AddMvc()
    .AddControllersAsServices() // this one for your case
    .AddViewComponentsAsServices()
    .AddTagHelpersAsServices();

我自己剛剛遇到了這個問題,所以我想我會分享以供將來參考,因為我有一個案例,我想解決一個委托,但包括一個額外的庫似乎有點過頭了。

鑒於以下定義:

public interface ISomething { /*...*/ };
public interface ISomeService { /*...*/ }

public class SomeService : ISomeService { /*...*/ }

public class Something
{
    public Something(ISomeService service, string key) { /*...*/ }
}

// I prefer using a delegate for readability but you
// don't have to use one
public delegate ISomething CreateSomething(string key);

委托可以像這樣注冊:

var builder = services
    .AddSingleton<ISomeService, SomeService>()
    .AddTrasient<CreateSomething>(provider => key => new Something(provider.GetRequiredService<ISomeService>(), key));

暫無
暫無

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

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