如何调用 Startup.cs 中的存储库?

How can I call a repository in Startup.cs?

我想通过存储库从我的 Startup.cs 文件中的数据库中获取一个值。但是服务无法解析。

我知道我需要创建我的存储库的一个实例然后访问它。我看到有人问过类似的问题,但我不想创建新服务:.NET Core 2 - Call Repository method from Startup

在我的 Startup.cs 中,我有以下内容:

public Startup(IConfiguration configuration, IRepository repo)
{
   Configuration = configuration;
   Repo = repo;
}

public IRepo Repo { get; }

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<IRepository, Repository>();
  var data = Repo.GetValue();
}

当我 运行 虽然我收到无法解析服务的错误。

您不能只在 Startup 构造函数中注入任何您喜欢的东西。有几项是允许的,例如 IConfigurationIHostingEnvironment 等,但那是因为这些服务在启动管道的早期 非常 注册。在这里,您试图注入一些您稍后才定义为服务的东西。 (必须先构造 Startup 才能调用 ConfigureServices。)

不清楚您的最终目标是什么(即您要对数据做什么)。但是,一般来说,实际上应该在 Program.cs 中添加启动时应为 运行 的代码,而不是 Startup.cs。喜欢:

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    // do something

    host.Run();
}

拥有主机后,您可以从中提取服务:

var repo = host.Services.GetRequiredService<IRepository>();
var data = repo.GetValue();

如果你需要做一些异步的事情,那么你需要使用一个异步 Main,然后等待 host.RunAsync():

public static async Task Main(string[] args)
{
    var host = BuildWebHost(args);

    // do something async

    await host.RunAsync();
}