asp.net-core - 在 Razor 视图中注入控制器与注入服务
问题描述
在 Razor 视图中注入依赖项的最佳实践是什么?
我们可以将控制器用作服务并注入或注入服务
我不知道这些注入方式的优缺点是什么。
- 控制器:
在 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>
- 服务:
在 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>
解决方案
我将通过假设应用程序是一个 .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的工作原理。
推荐阅读
- acumatica - 更改默认字段的标签名称
- python - 为什么 tkinter 不更新完成百分比?
- gem5 - 什么是 gem5 注释 mops 魔术说明以及如何使用它们?
- c# - 如何在 AWS 中为 cron 作业部署和运行窗口服务?
- tensorflow - Tensorflow:Model_Average_optimizer 在为关键字参数“dtype”获取多个值时使用问题
- javascript - 为什么 JavaScript 中 parseInt("10e+1") 和 parseFloat("10e+1") 的输出不同?
- yaml - Hugo 降价元数据
- r - R Studio Github md 文件没有图片
- web-crawler - StormCrawler:集群的最佳拓扑
- java - 在 Java 8 中为类的所有方法添加跟踪