Как вызвать метод другого проекта, в котором реализован DI - PullRequest
0 голосов
/ 15 февраля 2020

Я думаю, что реализовал плохую архитектуру. Пожалуйста, следуйте за мной, пожалуйста.

У меня есть project1 , это простой скребок. Всякий раз, когда он получает ответ от процесса очистки, он хочет сохранить данные в базе данных. У него есть собственный DI-контейнер.

У меня есть project2 , который отвечает за выполнение миграции БД, и я разместил здесь также logi c для доступа и изменения базы данных. Я хотел сохранить все логи c для управления БД только в одном месте. У него есть собственный DI-контейнер.

Наконец, у меня есть project3 , который представляет собой API, который при запросе обслуживает данные, хранящиеся в БД. Он имеет свой собственный контейнер DI.

Как вы можете видеть project2 находится посередине, он используется как проектом скребка при сохранении данных, так и проектом API для обслуживания данных. В project2 моя регистрация DI выглядит следующим образом:

private static IServiceCollection ConfigureServices(IConfiguration Configuration)
{
    IServiceCollection services = new ServiceCollection();

    // Inject IOptions<T>
    services.AddOptions();
    var dbSettings = Configuration.GetSection("Settings");
    services.Configure<DbSettings>(dbSettings);

    return services;
}

То, что он делает, это просматривает настройки приложения (есть только строка подключения к сохраненной базе данных) и готовит IOption для введения в случае необходимости. Так, в project2 есть, например, метод проверки, если БД пуста.

public class DbClient : IDbClient
{
    private readonly IOptions<DbSettings> _dbSettings;
    public DbClient(IOptions<DbSettings> dbSettings)
    {
        _dbSettings = dbSettings;
    }

    public bool IsDbEmpty()
    {
        using (SqlConnection connection = new SqlConnection(_dbSettings.Value.ConnectionString))
        {
            var isEmpty = connection.QueryFirst<string>("SELECT COUNT(1) WHERE EXISTS (SELECT * FROM Test)");
            Console.ReadLine();
        }
    }
}

Угадайте, в чем проблема? Всякий раз, когда я пытаюсь вызвать этот метод из project1 (скребок) или project3 (API), IOptions не вводится, потому что я не вызывал контейнер проект2 . Как мне это решить? Заранее спасибо!

1 Ответ

0 голосов
/ 15 февраля 2020

Один из подходов заключается в том, чтобы ваш общий проект (" project2 ") предоставлял некоторые функции для конфигурации, которые можно использовать при использовании приложений (" project1 " и " project3"").

С помощью. NET Core вы можете сделать это, определив IServiceCollection методы расширения в вашем общем проекте (" project2"):

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddProject2(this IServiceCollection services, IConfiguration configuration)
    {
        services.AddOptions();
        var dbSettings = configuration.GetSection("Settings");
        services.Configure<DbSettings>(dbSettings);

        return services;
    }
}

И затем вызывается из-за запуска проектов-потребителей (" project1 " и " project3 "):

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddProject2(Configuration);

    ...
}

Обратите внимание, что вы можете определить конфигурацию, необходимую для « project2 » в любом проекте, который его использует.

...