Tùy chỉnhInjection phụ thuộc trong .NET 6.0

Giới thiệu

Bài viết này là phần thứ ba trong loạt bài về việc tạo khuôn khổ tùy chỉnh cho ASP.NET 6.0. Trong phần này, chúng ta sẽ tìm hiểu về Injection phụ thuộc (DI) trong ASP.NET Core và cách tùy chỉnh nó.

Điểm cần chuẩn bị kỹ thuật

Tạo ứng dụng MVC bằng cách chạy命令 sau trong terminal:

dotnet new mvc -n DiSample -o DiSample

Mở dự án bằng Visual Studio hoặc Visual Studio Code:

cd DiSample
code .

Sử dụng các container DI khác

Trong phần lớn các dự án, container DI mặc định của ASP.NET Core đã đáp ứng được các yêu cầu. Tuy nhiên, có một số trường hợp bạn có thể muốn sử dụng container DI khác:

  • Sử dụng container DI như Microsoft.Extensions.DependencyInjection để tận dụng các module.
  • Cấu hình dịch vụ trong các file cấu hình bên ngoài như XML hoặc JSON.
  • Thêm các dịch vụ vào container DI một cách dynamic trong thời gian chạy.

Khám phá phương pháp ConfigureServices

So sánh phương pháp ConfigureServices trong ASP.NET Core 3.1 và 6.0:

ASP.NET Core 3.1:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
    });
    services.AddControllersWithViews();
}

ASP.NET Core 6.0:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();

Sự khác biệt chính là việc sử dụng WebApplication.CreateBuilder để配置 dịch vụ thay vì phương pháp ConfigureServices trong file Startup.cs.

Thay thếIServiceProvider

Nếu bạn muốn sử dụng container DI khác như Microsoft.Extensions.DependencyInjection, bạn cần đăng ký một factory(IServiceProviderFactory) để tạo ra đối tượng ServiceProvider:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public static class IHostBuilderExtension
{
    public static IHostBuilder UseCustomServiceProviderFactory(this IHostBuilder hostBuilder)
    {
        hostBuilder.UseServiceProviderFactory(new CustomServiceProviderFactory());
        return hostBuilder;
    }
}

Sử dụng factory này trong Program.cs:

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseCustomServiceProviderFactory();
builder.Services.AddControllersWithViews();

Giới thiệu về Scrutor

Scrutor là một thư viện NuGet hữu ích để tự động đăng ký các dịch vụ vào container DI. Bạn có thể thêm Scrutor vào Dự án bằng cách chạy:

dotnet add package Scrutor

Scrutor thêm một phương pháp mở rộng vào IServiceCollection để tự động đăng ký các dịch vụ:

builder.Services.Scan(scan => scan
    .FromAssemblyContaining<MyService>()
    .AddClasses()
    .Where(c => c.Name.EndsWith("Service"))
    .AsScoped());

Tóm lại

Bạn có thể thay thế container DI mặc định của ASP.NET Core bằng bất kỳ container nào tương thích với .NET Standard. Nếu container của bạn không hỗ trợ ServiceProvider, bạn cần tự implement interface IServiceProvider và đăng ký các dịch vụ một cách phù hợp.

Thẻ: ASP.NET Core 6.0 DI IServiceProvider Scrutor

Đăng vào ngày 17 tháng 6 lúc 19:05