C# cơ bản .NET Core

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:

Startup.cs
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.cs
public 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


Đăng ký nhận bài viết mới