如何在ASP.NET Core 的任意類中注入Configuration
遇到的問題
我已經(jīng)通讀了 MSDN 上關(guān)于 Configuration 的相關(guān)內(nèi)容,文檔說可實現(xiàn)在 application 的任意位置訪問 Configuration .
下面是 Startup.cs 的模板代碼。
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}
}
我知道可以通過 DI 的方式將 Configuration 注入到 Controller,Service,Repository 等地方,但在真實項目中,會有很多類是在這三塊之外的。
請問我如何在這三大塊之外實現(xiàn) Configuration 的注入呢?換句話說:可以在任意類中實現(xiàn) Configuration 的注入... 😭
解決方案
在 .NET Core 中你可以將 IConfiguration 作為參數(shù)直接注入到 Class 的構(gòu)造函數(shù)中,這本身就是可以的,如下代碼所示:
public class MyClass
{
private IConfiguration configuration;
public MyClass(IConfiguration configuration)
{
ConnectionString = new configuration.GetValue<string>("ConnectionString");
}
}
接下來要做的就是 new MyClass(),很顯然這樣做是不行的,因為你的構(gòu)造函數(shù)還需要一個 IConfiguration 類型的參數(shù),所以你需要將 new MyClass() 塞入到 Asp.NET Core 的 DI 鏈中。
思路也很簡單。
- 將 MyClass 注入到 ServiceCollection 容器中
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<MyClass>();
services.AddControllers();
}
- 生成 MyClass 實例
在 MyClass 的調(diào)用方處通過 DI 生成實例,這里以 Controller 處為例,如下代碼所示:
public class MyController : ControllerBase
{
private MyClass _myClass;
public MyController(MyClass myClass)
{
_myClass = myClass;
}
}
這樣是不是就完美的實現(xiàn)了在 MyClass 中使用 Configuration 了?
還有一種更簡單粗暴的做法,無需注入, 只需定義一個靜態(tài)的類,在 Startup 中將 IConfiguration 賦值給該靜態(tài)類保存即可,參考代碼如下:
public static class MyAppData
{
public static IConfiguration Configuration;
}
public Startup(IConfiguration configuration)
{
Configuration = configuration;
MyAppData.Configuration = configuration;
}
然后就可以在項目的各處訪問 MyAppData.Configuration 啦。
總結(jié)
在 Asp.Net 時代,讀取配置文件真的是一點都不需要操心,一個 ConfigurationManager 走天下😄😄😄,比如下面的代碼:
private static string AppKey = ConfigurationManager.AppSettings["AppKey"];
反倒在 Asp.Net Core 中卻有點懵逼了,就像題主說的,我想在任意類中都可以讀取 Configuration 😂😂😂,問題的差異來自于 Asp.Net Core 使用了 DI先行 的打法,哈哈,忘了過去吧,從 ♥ 開始 ...
以上就是如何在 ASP.NET Core 的任意類中注入Configuration 的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core 注入Configuration 的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解ASP.NET 生成二維碼實例(采用ThoughtWorks.QRCode和QrCode.Net兩種方式)
本篇文章主要介紹了ASP.NET 生成二維碼實例,使用了兩種方法,包括ThoughtWorks.QRCode和QrCode.Net,具有一定的參考價值,有興趣的可以了解一下。2016-12-12
ASP.NET?MVC5網(wǎng)站開發(fā)咨詢管理的架構(gòu)(十一)
這篇文章主要介紹了ASP.NET?MVC5網(wǎng)站開發(fā)咨詢管理的架構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-09-09
在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法
下面小編就為大家分享一篇在.NET Core類庫中使用EF Core遷移數(shù)據(jù)庫到SQL Server的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
ASP.NET Core使用HttpClient調(diào)用WebService
這篇文章介紹了ASP.NET Core使用HttpClient調(diào)用WebService的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03

