控制台应用程序不像网络应用程序那样将启动文件与配置服务一起使用,我正在努力理解依赖注入的关键概念。
(请注意以下示例无法编译)
这是我认为它应该如何工作的基本示例(请指出任何非常规或错误的内容):
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 位。
我已经搜索了很多,并且有很多网络应用程序的示例,但控制台应用程序的示例却很少。我是否完全误解了依赖注入的整个概念?