Внедрение зависимости в службу gRP C - PullRequest
0 голосов
/ 25 мая 2020

Я создал службу gRP C с помощью Protobuff в Visual Studio с ядром. NET и хочу протестировать службу.

У службы есть конструктор:

public ConfigService(ILogger<ConfigService> logger)
{
    _logger = logger;
}

Как и ILogger, который каким-то образом вводится (и я понятия не имею, как), я хочу ввести дополнительный параметр - интерфейс. Этот интерфейс должен быть легко настроен во время выполнения, поскольку я хочу установить определенный класс при запуске реального запуска и фиктивный класс при тестировании. например, что-то вроде:

public ConfigService(ILogger<ConfigService> logger, IMyInterface instance)
{
    _logger = logger;
    _myDepndency = instance;
}

, и это в реальном экземпляре запуска будет new RealClass(), но при тестировании будет легко передать new MockClass().

Класс запуска по-прежнему по умолчанию:

 public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGrpcService<ConfigService>();

            endpoints.MapGet("/", async context =>
            {
                await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
            });
        });
    }
}

Как я могу ввести второй параметр конструктора службы?

1 Ответ

2 голосов
/ 25 мая 2020

В простейшей форме вы можете просто добавить свою зависимость к IServiceCollection в методе ConfigureServices;

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
    services.AddScoped<IMyInterface, MyClassImplementingInterface>();
}

Это зарегистрирует вашу зависимость в коллекции сервисов и позволит автоматически вводить ее через инъекцию конструктора. В своем тесте вы будете вводить его сами как имитацию, о чем, кажется, знаете.

См. Ссылку для справки: Внедрение зависимостей в ASP. NET Core

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...