یک نکتهی تکمیلی: روش تزریق وابستگیها به تنظیمات MvcBuilder در متد ConfigureServices
- روش دیگر آن به کمک IConfigureOptions و معرفی آن به سیستم تزریق وابستگیها است تا وابستگیهای آنرا به صورت خودکار تامین کند:
public class AppJsonOptions : IConfigureOptions<JsonOptions>
{
private readonly IHttpContextAccessor _accessor;
public AppJsonOptions(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public virtual void Configure(JsonOptions options)
{
options.JsonSerializerOptions.Converters.Add(new BooleanConverter(_accessor));
}
}
پس از این تعریف، نحوهی معرفی آن به سیستم به صورت زیر خواهد بود:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddSingleton<IConfigureOptions<JsonOptions>, AppJsonOptions>();
و Converter تعریف شده هم به این نحو میتواند به وابستگیها دسترسی پیدا کند:
public class BooleanConverter : JsonConverter<bool>
{
private readonly IHttpContextAccessor _accessor;
public BooleanConverter(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var testService = _accessor.HttpContext.RequestServices.GetRequiredService<TestService>();
// ...
throw new NotSupportedException();
}
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
{
}
}
علت استفادهی از IHttpContextAccessor در اینجا این است که چون IConfigureOptions به صورت Singleton ثبت میشود، بنابراین فقط سرویسهایی با طول عمر Singleton را هم میتوان به آن تزریق کرد؛ اما RequestServices.GetRequiredService این محدودیت را ندارد.