Я думаю, что реализовал плохую архитектуру. Пожалуйста, следуйте за мной, пожалуйста.
У меня есть 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 . Как мне это решить? Заранее спасибо!