Консольные приложения не используют файл запуска со службами настройки, как это делают веб-приложения, и я изо всех сил пытаюсь понять важную концепцию внедрения зависимостей.
(Обратите внимание, что приведенный ниже пример не компилируется)
Вот базовый пример того, как я думаю, это должно работать (пожалуйста, укажите на что-нибудь необычное или неправильное):
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");
}
Но как мне использовать эти сервисы внутри моего класса Worker ?:
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."
});
}
}
Понимание DIContext
public class UnderstandingDIContext : DbContext
{
public UnderstandingDIContext(DbContextOptions<UnderstandingDIContext> options)
: base(options)
{ }
public DbSet<UnderstandingDIModel> UnderstandingDITable { get; set; }
}
Проблемы с этим кодом заключаются в следующем:
Worker () ожидает передачи параметров ILogger и IConfiguration, но я думал, что внедрение зависимостей должно покрыть это?
Я не могу запустить «dotnet ef migrations add Initial», потому что я неправильно передаю строку подключения (ошибка: «Невозможно создать объект типа« UnderstandingDIContext ».»)
'using (var context = new UnderstandingDIContext ())' не будет компилироваться, потому что я неправильно понимаю бит DbContext.
Я ОЧЕНЬ много искал, и есть много примеров для веб-приложений, но очень мало для консольных приложений. Я просто неправильно понимаю всю концепцию внедрения зависимостей?
new Worker()
себя. Вместо этого зарегистрируйте его в своемServiceCollection
и позвольте DI создать его для вас. - person Dai   schedule 04.05.2019