如何使用依赖注入在 razor 页面中检索服务
How to retrieve a service in razor pages with dependency injection
在 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# 中一样 class 或者即使是 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();
}
在 asp.net 核心剃须刀页面中也可以进行依赖注入。
您可以在页面模型中进行构造函数注入class。
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
在 .Net 6 中,该过程得到了简化。
在 .NET 6 Core Web App (Razor Pages) 中,您需要将服务接口添加到 Program.cs 中的 Web 应用程序生成器的实现映射,如下所示: builder.Services.AddScoped<IMyDependency, MyDependency>();
更多信息可以在 Dependency injection in ASP.NET Core
找到
完成后,您可以在页面模型中使用依赖注入 class,如上所述。
在 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# 中一样 class 或者即使是 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();
}
在 asp.net 核心剃须刀页面中也可以进行依赖注入。
您可以在页面模型中进行构造函数注入class。
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
在 .Net 6 中,该过程得到了简化。
在 .NET 6 Core Web App (Razor Pages) 中,您需要将服务接口添加到 Program.cs 中的 Web 应用程序生成器的实现映射,如下所示: builder.Services.AddScoped<IMyDependency, MyDependency>();
更多信息可以在 Dependency injection in ASP.NET Core
完成后,您可以在页面模型中使用依赖注入 class,如上所述。