簡體   English   中英

在 IServiceCollection 擴展方法中讀取選項構建器的屬性

[英]Read properties of options builder in IServiceCollection extension method

我在IServiceCollection上有一個擴展方法,如下所示:

public static IServiceCollection AddMyProjData(this IServiceCollection services, Action<MyProjDataOptionsBuilder> optionsBuilder)
{
    services.Configure(optionsBuilder);

    services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
        .UseLazyLoadingProxies()
        .UseMySql("?????")
    );

    return services;
}

MyProjOptionsBuilder類如下所示:

public class MyProjDataOptionsBuilder
{
    public string ConnectionString { get; set; }
}

如何在我的擴展方法中訪問屬性ConnectionString

我想做這樣的事情:

var connectionString = optionsBuilder().ConnectionString;

附注。

我知道我可以直接將string作為參數而不是Action傳遞給擴展方法AddMyProjData 但在我的實際項目中,我需要設置的設置不僅僅是一個ConnectionString

我也喜歡使用Action來配置服務的風格。

你可以只創建一個實例MyProjDataOptionsBuilderAddMyProjData ,適用optionsBuilder針對實例,然后使用你所需要的性能。

下面是一個例子:

public static IServiceCollection AddMyProjData(
    this IServiceCollection services,
    Action<MyProjDataOptionsBuilder> optionsBuilder)
{
    var myProjDataOptionsBuilder = new MyProjDataOptionsBuilder();
    optionsBuilder(myProjDataOptionsBuilder);

    services.Configure(optionsBuilder);

    services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
        .UseLazyLoadingProxies()
        .UseMySql(myProjDataOptionsBuilder.ConnectionString)
    );

    return services;
}

這里發生的事情有一些重復(調用optionsBuilder兩次),但我不希望這總體上是一個很大的成本。

另一種方法是將您的配置時間和運行時選項分開 - 我懷疑您是否會在擴展方法內部以外的任何地方都需要連接字符串本身,但我只是在這里猜測。


從您在 OP 中顯示的內容來看,我不相信MyProjDataOptionsBuilder是一個好名字(我可能只使用MyProjDataOptions ),但這主要是在這里的一個旁白。

暫無
暫無

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

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