C# C#  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Внедрение зависимостей

Проверяет встроенный контейнер зависимостей, времена жизни, области, фабрики и composition root. В сценариях нужно распознать захваченную scoped-зависимость, скрытый service locator, неверное владение IDisposable и архитектурную цену удобного разрешения сервисов.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 30
Что показывает constructor injection?
C#
public sealed class InvoiceService(
    IInvoiceRepository repository,
    IClock clock)
{
}
Вопрос 2 из 30
Что произойдёт при запросе незарегистрированного конкретного класса, даже если все параметры его открытого конструктора можно разрешить?
C#
var services = new ServiceCollection();
using var provider = services.BuildServiceProvider();
var concrete = provider.GetRequiredService<ConcreteService>();
Вопрос 3 из 30
Как получить все зарегистрированные IHandler?
C#
services.AddTransient<IHandler, EmailHandler>();
services.AddTransient<IHandler, SmsHandler>();

public Dispatcher(IEnumerable<IHandler> handlers) { }
Вопрос 4 из 30
Что даёт open generic registration?
C#
services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>));
Вопрос 5 из 30
Как раньше обнаружить неразрешимый граф?
Вопрос 6 из 30
Что означает Scoped в ASP.NET Core?
C#
services.AddScoped<RequestState>();
using var scope = provider.CreateScope();
var first = scope.ServiceProvider.GetRequiredService<RequestState>();
var second = scope.ServiceProvider.GetRequiredService<RequestState>();
Вопрос 7 из 30
Почему singleton не должен напрямую зависеть от scoped DbContext?
C#
services.AddSingleton<ReportCache>();
services.AddScoped<AppDbContext>();

public sealed class ReportCache(AppDbContext db)
{
}
Вопрос 8 из 30
Как BackgroundService получить scoped-сервис на одну итерацию?
C#
using var scope = scopeFactory.CreateScope();
var worker = scope.ServiceProvider.GetRequiredService<ScopedWorker>();
await worker.RunAsync(stoppingToken);
Вопрос 9 из 30
Кто Dispose-ит сервис, созданный контейнером?
Вопрос 10 из 30
Когда Transient IDisposable может быть проблемой?
C#
var item = root.GetRequiredService<DisposableTransient>();
item.Use();
Вопрос 11 из 30
Где обычно находится composition root?
Вопрос 12 из 30
Зачем extension-метод AddBillingModule?
C#
public static IServiceCollection AddBillingModule(
    this IServiceCollection services, IConfiguration config)
{
    services.AddOptions<BillingOptions>()
        .Bind(config.GetSection("Billing"))
        .ValidateDataAnnotations()
        .ValidateOnStart();
    return services.AddScoped<IBillingService, BillingService>();
}
Вопрос 13 из 30
Что решает decorator?
C#
public sealed class LoggingSender(IMessageSender inner, ILogger<LoggingSender> log)
    : IMessageSender
{
    public async Task SendAsync(Message message, CancellationToken token)
    {
        log.LogInformation("Sending {Id}", message.Id);
        await inner.SendAsync(message, token);
    }
}
Вопрос 14 из 30
Когда factory лучше прямой зависимости?
C#
public interface IExporterFactory
{
    IExporter Create(ExportFormat format);
}
Вопрос 15 из 30
Как выбирать реализацию по фиксированному ключу в современном встроенном DI?
Вопрос 16 из 30
Почему IServiceProvider в доменном сервисе — запах?
C#
public sealed class CheckoutService(IServiceProvider services)
{
    public Task RunAsync() =>
        services.GetRequiredService<IPaymentGateway>().ChargeAsync();
}
Вопрос 17 из 30
Что не так с GetService<T>() для обязательной зависимости?
C#
var sender = provider.GetService<IEmailSender>();
sender!.Send(message);
Вопрос 18 из 30
Почему BuildServiceProvider внутри ConfigureServices опасен?
Вопрос 19 из 30
Когда IServiceProvider допустим?
Вопрос 20 из 30
Как заменить locator, выбирающий formatter по enum?
C#
public sealed class FormatterFactory(
    IReadOnlyDictionary<Format, IFormatter> formatters)
{
    public IFormatter Get(Format format) => formatters[format];
}
Вопрос 21 из 30
Какой smoke-тест полезен для DI?
C#
var services = new ServiceCollection();
services.AddApplication(configuration);
using var provider = services.BuildServiceProvider(new ServiceProviderOptions
{
    ValidateOnBuild = true,
    ValidateScopes = true
});
provider.GetRequiredService<OrderEndpoint>();
Вопрос 22 из 30
Как проверить Scoped lifetime?
Вопрос 23 из 30
Что журналировать при resolution failure?
Вопрос 24 из 30
Нужен ли health check, который создаёт весь граф на каждый запрос?
Вопрос 25 из 30
Как увидеть слишком частое создание transient-сервиса?
C#
metrics.ServiceCreated.Add(1, new("service", "PdfRenderer"));
Вопрос 26 из 30
Что должно происходить в constructor сервиса?
Вопрос 27 из 30
Почему слишком широкий constructor — архитектурный сигнал?
C#
public MegaService(A a, B b, C c, D d, E e, F f, G g, H h) { }
Вопрос 28 из 30
Когда внедрение зависимостей, сгенерированное во время компиляции, особенно полезно?
Вопрос 29 из 30
Почему singleton-кэш не всегда ускоряет систему?
Вопрос 30 из 30
Как DI помогает модульной архитектуре?
C#
services.AddOrdersModule();
services.AddPaymentsModule();

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу