簡體   English   中英

.NET Core DI 查看 IConfiguration

[英].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 來說是可能的,但是......您應該考慮一些嚴重的限制:

  • 此代碼不適用於開放通用注冊。 事實上,這是 MS.DI 的一個限制,它阻止您有效地將此方法應用於開放泛型類型。
  • 一旦應用,您就不能應用以相同方式工作的其他擴展,因為一旦將實現類型的描述符替換為使用工廠委托的描述符,DI 系統就會變得盲目。 例如,如果您使用 Scrutor(在 MS.DI 之上工作)應用裝飾器,您可能會看到一些奇怪的行為,具體取決於應用它們的順序。
  • ActivatorUtilities.CreateInstance的使用使 DI 系統失明。 在 MS.DI 包含防止循環依賴的檢查的情況下,使用ActivatorUtilities.CreateInstance將導致在循環依賴的情況下難以調試堆棧溢出異常。
  • 這個特定的實現是幼稚的,並且可能會搞砸,因為它改變了注冊的順序。 如果您在作為集合的一部分的類上使用該屬性,或者當您有一個替換另一種類型的類型(通常通過將注冊附加到列表來工作)時,這可能會中斷。 要解決此問題,您必須將新描述符插入列表中與刪除舊描述符的位置相同的位置。
  • 可能還有更多警告,但這些是我能從腦海中回憶起來的。

暫無
暫無

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

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