Cách đơn giản và đúng đắn nhất để đạt được điều này, trong tất cả các phiên bản của ASP.NET Core , là triển khai IConfigureOptions<TOptions>
giao diện. Mặc dù điều này đã có từ thời .NET Core 1.0, nhưng có vẻ như ít người biết về cách nó tạo ra mọi thứ Just Work ™.
Ví dụ: bạn muốn thêm trình xác thực mô hình tùy chỉnh có phụ thuộc vào một trong các dịch vụ khác của ứng dụng của bạn. Ban đầu có vẻ như không thể - không có cách nào để giải quyết IMyServiceDependency
vì bạn không có quyền truy cập vào IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Nhưng "phép thuật" của IConfigureOptions<TOptions>
nó làm cho nó trở nên quá dễ dàng:
public class MyMvcOptions : IConfigureOptions<MvcOptions>
{
private IMyServiceDependency _dependency;
public MyMvcOptions(IMyServiceDependency dependency)
=> _dependency = dependency;
public void Configure(MvcOptions options)
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(_dependency));
}
}
public void ConfigureServices(IServiceCollection services)
{
// or scoped, or transient
services.AddSingleton<IConfigureOptions<MvcOptions>, MyMvcOptions>();
services.AddControllers();
}
Về cơ bản, bất kỳ thiết lập nào bạn đã thực hiện trong các Add***(***Options)
đại diện ConfigureServices
hiện được chuyển sang phương thức IConfigureOptions<TOptions>
của lớp bạn Configure
. Sau đó, bạn đăng ký các tùy chọn giống như cách bạn đăng ký bất kỳ dịch vụ nào khác, và bạn sẽ đi!
Để biết thêm chi tiết, cũng như thông tin về cách hoạt động đằng sau hậu trường này, tôi giới thiệu bạn với Andrew Locke luôn xuất sắc .