![](/img/trans.png)
[英]How do you implement DI for IConfiguration in ASP.NET Core 6?
[英].NET Core DI looking into IConfiguration
在 ASP.NET Core DI 中支持基於屬性的設置參考解析的最簡單方法是什么? 我想做這樣的事情來讀取配置值:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
public WeatherForecastController(
[Setting("Logging:LogLevel:Microsoft")] string logLevel)
{
…
當appsettings.json
看起來像:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
…
任何想法如何處理它? 我希望它也適用於服務。
從技術上講,使用 MS.DI 可以實現這一點,但這樣做非常困難,而且正如 Dmitry 所提到的,使用 Autofac 或 Simple Injector 等成熟的 DI 容器會更幸運。
如果您真的想繼續使用 MS.DI,這里有一些代碼可以幫助您入門:
var settingDescriptors = (
from descriptor in services
let type = descriptor.ImplementationType
where type != null && !type.IsGenericTypeDefinition
where type.GetConstructors().Single().GetParameters()
.Any(p => p.GetCustomAttribute<SettingAttribute>() != null)
select descriptor)
.ToArray();
foreach (var descriptor in settingDescriptors)
{
services.Remove(descriptor);
object[] settings = // TODO: Determine settings from parameters here
services.Add(new ServiceDescriptor(
descriptor.ServiceType,
c => ActivatorUtilities.CreateInstance(
c,
descriptor.ImplementationType,
settings),
descriptor.Lifetime));
}
這段代碼的作用是遍歷服務集合並替換所有注冊的實現,該實現具有用SettingAttribute
標記的構造函數參數。 該注冊被替換為使用工廠委托的注冊,該委托要求 DI 容器創建一個實例,同時為其提供一個或多個對象(設置)。 換句話說,它在手動提供對象時啟用自動連線。
這意味着,在某種程度上,這對於 MS.DI 來說是可能的,但是......您應該考慮一些嚴重的限制:
ActivatorUtilities.CreateInstance
的使用使 DI 系統失明。 在 MS.DI 包含防止循環依賴的檢查的情況下,使用ActivatorUtilities.CreateInstance
將導致在循環依賴的情況下難以調試堆棧溢出異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.