【问题标题】:How to retrieve a service in razor pages with dependency injection如何使用依赖注入在 Razor 页面中检索服务
【发布时间】:2018-05-07 20:59:18
【问题描述】:

在 ASP.NET Core 2 应用程序中,我设置了一些服务:

 public void ConfigureServices(IServiceCollection services)
 {
    services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyContext")));
    services.AddHangfire(options => options.UseSqlServerStorage(Configuration.GetConnectionString("MyContext")));
    services.AddOptions();
    services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));
    services.AddMvc().AddDataAnnotationsLocalization();

    services.AddScoped<IMyContext, MyContext>();
    services.AddTransient<IFileSystem, FileWrapper>();
    services.AddTransient<Importer, Importer>();
 }

program.cs 中,我可以检索自己的服务:

var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var ip = services.GetRequiredService<Importer>();
    Task task = ip.ImportListAsync();
}

现在我试图了解当我没有主机变量时如何做同样的事情,就像在任何其他 C# 类中或者即使是 cshtml 页面一样:

public async Task<IActionResult> OnPostRefresh()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    // host is not defined: how to retrieve it?
    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        var ip = services.GetRequiredService<Importer>();
        Task task = ip.ImportListAsync();
    }

    return RedirectToPage();
}

【问题讨论】:

  • 什么是hosts?您希望我们神奇地猜出您分配给变量的内容吗?另外,您是否阅读过 Microsoft 文档中的 DI 教程?
  • 阅读this basic tutorial 并在您无法继续时提出真正的问题。
  • 我很抱歉。我在复制/粘贴中错过了一行。很抱歉。
  • 我阅读了该文档,但我很困惑,因为他们在谈论视图和控制器 (MVC),但我没有使用 MVC,因此我认为它不适用于我的场景。我不确定我应该依赖哪些文档。
  • 您的问题标题为“从 cshtml 检索服务”。 CSHTML => 剃刀 => 视图。如果您的问题标题提到 MVC,您为什么不使用 MVC?

标签: c# asp.net-core-2.0 razor-pages


【解决方案1】:

在 asp.net core razor 页面中也可以进行依赖注入。

您可以在页面模型类中进行构造函数注入。

public class LoginModel : PageModel
{
    private IFileSystem fileSystem;
    public LoginModel(IFileSystem fileSystem)
    {
        this.fileSystem = fileSystem;
    }

    [BindProperty]
    public string EmailAddress { get; set; }

    public async Task<IActionResult> OnPostRefresh()
    {
       // now you can use this.fileSystem
       //to do : return something
    }
}

在页面中也可以进行依赖注入:)。只需使用inject 指令即可。

@model YourNameSpace.LoginModel 
@inject IFileSystem FileSystem;
<h1>My page</h1>
// Use FileSystem now

【讨论】:

  • 不适合我。还有什么需要配置的吗?
【解决方案2】:

在 .Net 6 中,该过程已被简化。

在 .NET 6 Core Web App (Razor Pages) 中,您需要将服务接口添加到 Program.cs 中的 Web 应用程序生成器的实现映射,如下所示:builder.Services.AddScoped&lt;IMyDependency, MyDependency&gt;(); 更多信息可以在Dependency injection in ASP.NET Core找到/p>

完成后,您可以如上所述在页面模型类中使用依赖注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2019-02-23
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多