- Cấu hình ứng dụng ASP.NET
- appsettings.json / IConfiguration
- Lấy config section như đối tượng lớp
- Inject option từ file config vào dịch vụ
Cấu hình ứng dụng ASP.NET
Cấu hình là cách lưu các thông tin cần thiết, cung cấp cho ứng dụng khi nó chạy.
Đối với ứng dụng ASP.NET các file cấu hình có thể lưu ở các định dạng XML, JSON, INI tùy cách lựa chọn.
Hiện nay, mặc định ứng dụng ASP.NET core sẽ nạp file cấu hình JSON lưu ở appsettings
.json
nếu nó tồn tại.
Về cấu hình trước tiên đọc kỹ phần Options - và nạp file config trong Dependency injection
Hãy copy mã nguồn phần trước,
ASP_NET_CORE/05.Session
, copy và đổi tên sang 06.Config
để thực hành
Toàn bộ cấu hình mặc định của ASP.NET lưu ở dịch vụ (có trong DI) với tên IConfiguration
,
để lấy được đối tượng cấu hình này dùng cú pháp như sau:
IConfiguration configuration = app.ApplicationServices.GetService<IConfiguration>();
(app
là đối tượng kiểu IApplicationBuilder
)
Từ đối tượng IConfiguration
có thể đọc config
File cấu hình appsettings.json và đọc config với IConfiguration
Mặc định ASP.NET nạp cấu hình từ file JSON appsettings.json
, hãy tạo file này
và cập nhật nội dụng giả định sau:
{ "TestOptions" : { "opt_key1": "PHONE", "opt_key2": { "k1": "LAPTOP", "k2": "value 2" } }, "OtherSection": { "key1": "value1 OtherSection", "key2": "value2 OtherSection" } }
Đối với dữ liệu Json thì nó lưu dữ liệu giá trị dạng key:value
,
những khối dạng key: {...}
thì gọi là section. Như trên có section: TestOptions
,
trong có giá trị opt_key1
, có section con opt_key2
, trong section con opt_key2
lại có giá trị k1
, k2
. Hãy nhớ cách phân biệt một key trỏ đến một giá trị hay
trỏ đến một section
File config trên là tự động nạp vào ứng dụng, lưu trong đối tượng dịch vụ với tên IConfiguration
.
Sử dụng đối tượng này để đọc config. Đọc cụ thể thông qua ví dụ sau:
Startup.cs
/.. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { /.. app.Map("/ShowOptions", appOptions => { appOptions.Run(async (context) => { StringBuilder stb = new StringBuilder(); IConfiguration configuration = appOptions.ApplicationServices.GetService<IConfiguration>(); var testoptions = configuration.GetSection("TestOptions"); // Đọc một Section trả về IConfigurationSection var opt_key1 = testoptions["opt_key1"]; // Đọc giá trị trong Section var k1 = testoptions.GetSection("opt_key2")["k1"]; // Đọc giá trị trong Section con var k2 = configuration["TestOptions:opt_key2:k2"]; // Đọc giá trị trong Section stb.Append($" TestOptions.opt_key1: {opt_key1}\n"); stb.Append($"TestOptions.opt_key2.k1: {k1}\n"); stb.Append($"TestOptions.opt_key2.k2: {k2}\n"); await context.Response.WriteAsync(stb.ToString().HtmlTag("pre")); }); }); /.. } /..
Truy cập địa chỉ /ShowOptions
thấy các cấu hình lưu trong appsettings.json
đã được tự động nạp và đọc được như hình:
Lấy section config như là đối tượng
Bạn có thể lấy một section sau đó convert nó thành một đối tượng lớp với các thuộc tính cùng trên với các giá trị trong Section bằng phương thức:
IConfiguration.Get<ClassName>()
Ví dụ tạo ra lớp TestOptions
như sau:
Options/TestOptions.cs
public class TestOptions { public string opt_key1 {set; get;} public SubTestOption opt_key2 {set; get;} } public class SubTestOption { public string k1 {set; get;} public string k2 {set; get;} }
Bạn thấy lớp này, có các thuộc tính tương thích với section TestOptions
trong appsettings.json
,
vậy có thể convert section này thành đối tượng lớp để từ đối tượng lớp truy cập được config. Sử dụng phương thức
Get của IConfigurationSection để chuyển đổi
Startup.cs
/.. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { /.. app.Map("/ShowOptions", appOptions => { appOptions.Run(async (context) => { StringBuilder stb = new StringBuilder(); IConfiguration configuration = appOptions.ApplicationServices.GetService<IConfiguration>(); TestOptions testoptions = configuration.GetSection("TestOptions").Get<TestOptions>(); var opt_key1 = testoptions.opt_key1; var k1 = testoptions.opt_key2.k1; var k2 = testoptions.opt_key2.k2; stb.Append($"TestOptions.opt_key1: {opt_key1}\n"); stb.Append($"TestOptions.opt_key2.k1: {k1}\n"); stb.Append($"TestOptions.opt_key2.k2: {k2}\n"); await context.Response.WriteAsync(stb.ToString().HtmlTag("pre")); }); }); /.. } /..
Chạy kết quả vẫn đọc được config như trên.
Inject option config vào dịch vụ DI
Cách làm này đã trình bày tổng quan tại
Sử dụng cấu hình từ File cho DI Container
, ví dụ áp dụng cho ASP.NET cụ thể ở trường hợp trên.
Giả sử khi tạo dịch vụ ProductController
, cần tham số là đối tượng lớp TestOptions
thì
ta phải làm các bước, cụ thể như sau:
public class Startup { /.. IConfiguration _configuration; //.. // Thêm khởi tạo để lấy IConfiguration của ứng dụng public Startup(IConfiguration configuration) { _configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddOptions(); // Kích hoạt Options var testoptions = _configuration.GetSection("TestOptions"); // đọc config services.Configure<TestOptions>(testoptions); // đăng ký để Inject /.. } /.. }
Giờ đối tượng nào khởi tạo cần dùng đến lớp TestOptions
có thể được Inject từ DI Container.
Ví dụ:
Controller/ProductController.cspublic class ProductController { /.. TestOptions options; //Khởi tạo có Inject Option từ DI Container (chú ý tham số IOptions<TestOptions>) public ProductController(IListProductName lsphone, LaptopName lslaptop, IOptions<TestOptions> options) { this.lsPhone = lsphone; this.lsLaptop = lslaptop; this.options = options.Value; } public async Task List(HttpContext context) { /.. sb.Append($"{options.opt_key1}".HtmlTag("h2")); /.. sb.Append($"{options.opt_key2.k1}".HtmlTag("h2")); /.. } /.. }
Mã nguồn ASP_NET_CORE/06.Config hoặc tải về ex052