首页 > 解决方案 > 在 Razor 视图中注入控制器与注入服务

问题描述

在 Razor 视图中注入依赖项的最佳实践是什么?

我们可以将控制器用作服务并注入或注入服务

我不知道这些注入方式的优缺点是什么。

  1. 控制器:

在 Startup.cs

 public void ConfigureServices(IServiceCollection services)
 {
     .
     .
     .
    services.AddControllersWithViews().AddControllersAsServices().AddRazorRuntimeCompilation();
 }

然后在 home.cshtml

@inject CourseController _courseControler 
.
.
.
<select asp-for="CategoryID" class="form-control round">
   @foreach (var item in await _courseControler.GetAllCourceCategory()){
      <option value="@item.ID">@item.Description</option>
   } 
</select>
  1. 服务:

在 Startup.cs

 public void ConfigureServices(IServiceCollection services)
 {
     .
     .
     .
    services.AddTransient<ICourseService, CourseService>();
 }

然后在 home.cshtml

@inject ICourseService _courseService
.
.
.
<select asp-for="CategoryID" class="form-control round">
   @foreach (var item in await _courseService.GetAllCourceCategory()){
      <option value="@item.ID">@item.Description</option>
   } 
</select>

标签: asp.net-corerazordependency-injection

解决方案


我将通过假设应用程序是一个 .NET Core MVC应用程序来解释这一点。(事实上​​,同样的原则也适用于 Razor Page 应用程序,但在实现时会有一些差异。)。

简而言之,在视图中注入控制器或服务并不是一个好主意。


使用@inject

来自.NET Core 文档

ASP.NET Core 支持将依赖项注入到视图中。这对于特定于视图的服务很有用。

因此,特定于视图是关键。

将控制器注入视图

同样,来自微软的文档

MVC 控制器负责响应针对 ASP.NET MVC 网站发出的请求。

当您将控制器注入视图文件时,您的控制器没有做它应该做的事情。

将服务注入视图

如果服务是特定于 UI 的,您可以这样做。您可以从官方文档中找到示例

如果您的服务不处理特定于 UI 的内容(例如,从数据库中获取数据),则应该在控制器级别(或者,.cshtml.cs当您使用 Razor Pages 时在文件中)注入它。

使用视图模型

如果ICourseService是特定于数据的服务,则应调用_courseService.GetAllCourseCategory()控制器操作。

您可能需要这样的视图模型

public class HomeViewModel
{
  public List<Course> Courses { get; set; }
}

在您的控制器操作中:

// inject ICourseService in the controller constructor
public Task<IActionResult> Home()
{
  var viewModel = new HomeViewModel
  {
    Courses = await _courseService.GetAllCourseCategory()
  };
  return View(viewModel);
}

在视图文件中:

@model HomeViewModel
<select asp-for="CategoryID" class="form-control round">
  @foreach (var item in Model.Courses) {
    <option value="@item.ID">@item.Description</option>
  } 
</select>

现在这就是典型的 MVC 应用程序的样子。


结论

可以在视图文件中注入控制器或服务,但大多数时候您不应该在 MVC 应用程序中这样做。这违反了控制器和视图的目的。同样,向视图注入非 UI 特定的服务也违反了视图的目的。

使用模型来承载您的数据(从服务中检索)。对流使用控制器。使用视图来渲染模型。这就是MVC的工作原理。


推荐阅读