Консольные приложения не используют файл запуска при настройке служб, как это делают веб-приложения, и я изо всех сил пытаюсь понять важнейшую концепцию внедрения зависимостей.
(обратите внимание, что приведенный ниже пример не компилируется)
Вот базовый пример того, как я думаю, что это должно работать (пожалуйста, укажите на что-нибудь необычное или неправильное):
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddUserSecrets<Settings>()
.Build();
var services = new ServiceCollection()
.AddLogging(b => b
.AddConsole())
.AddDbContext<UnderstandingDIContext>(options =>
options.UseSqlite(builder.GetConnectionString("DefaultConnection")))
.BuildServiceProvider();
var logger = services.GetService<ILoggerFactory>()
.CreateLogger<Program>();
logger.LogInformation("Starting Application");
var worker = new Worker();
logger.LogInformation("Closing Application");
}
Но как мне использовать эти сервисы в моем классе «Рабочий»?
public Worker(ILogger logger, IConfiguration configuration)
{
logger.LogInformation("Inside Worker Class");
var settings = new Settings()
{
Secret1 = configuration["Settings:Secret1"],
Secret2 = configuration["Settings:Secret2"]
};
logger.LogInformation($"Secret 1 is '{settings.Secret1}'");
logger.LogInformation($"Secret 2 is '{settings.Secret2}'");
using (var context = new UnderstandingDIContext())
{
context.Add(new UnderstandingDIModel()
{
Message = "Adding a message to the database."
});
}
}
UnderstandingDIContext
public class UnderstandingDIContext : DbContext
{
public UnderstandingDIContext(DbContextOptions<UnderstandingDIContext> options)
: base(options)
{ }
public DbSet<UnderstandingDIModel> UnderstandingDITable { get; set; }
}
Проблемы с этим кодом следующие:
Worker () ожидает передачи параметров ILogger и IConfiguration, но я подумал, что Dependency Injection должно охватывать это?
Я не могу запустить 'dotnet ef migrations add Initial', потому что неправильно передаю строку подключения (ошибка: «Невозможно создать объект типа« UnderstandingDIContext ». ')
'using (var context = new UnderstandingDIContext ())' не будет компилироваться, потому что я неправильно понимаю бит DbContext.
Я искал много, и есть много примеров для веб-приложений, но очень мало для консольных приложений. Я просто совершенно не понимаю всю концепцию внедрения зависимостей?