![](/img/trans.png)
[英]Is it possible to pass T as a DbContext into an extension method of 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
來配置服務的風格。
你可以只創建一個實例MyProjDataOptionsBuilder
內AddMyProjData
,適用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.