使用三层架构来搭建Razor Pages项目
admin
2022-01-10使用三层架构来搭建Razor Pages项目
导航:
在此视频中,我们将讨论如何使用ASP.NET Core 依赖注入容器注册服务。如果您不熟悉依赖项注入的概念,请查阅ASP.NET Core MVC教程的第19部分,该教程适用于初学者。
Razor Pages中的项目参考
目前,在我们的解决方案中有3个项目,
- YoYoMooc.StudentManagement.RazorPage - 这是 Razor PagesWeb应用程序项目
- YoYoMooc.StudentManagement.Models -这是一个.Net标准类库项目,其中包含
Student
和MajorEnum
等领域模型。 - YoYoMooc.StudentManagement.Services-这也是一个.Net标准类库项目,其中包含数据访问服务。 最终,我们希望 Razor PagesWeb应用程序查询并显示学生列表,如下所示。
为了使Web应用程序能够做到这一点,它需要同时引用Models
和Services
项目。因此,添加对Services
项目的引用,引入后我们无须再去引用Models
类库的关系,因为我们的Services
类库依赖于Modles类库了。
以上便是我们作为初学者,经常接触的三层架构。
注入服务
这是“Students”文件夹中的Index.chtml Razor Pages,其中显示了学生列表。如下所示修改相应的PageModel
类(Index.cshtml.cs)。
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.RazorPages;
using YoYoMooc.StudentManagement.Models;
using YoYoMooc.StudentManagement.Services;
namespace YoYoMooc.StudentManagement.RazorPage.Pages.Students
{
public class IndexModel : PageModel
{
private readonly IStudentRepository _studentRepository;
/// <summary>
/// //这个公共属性保存学生列表 显示模板(Index.html)可以访问此属性
/// </summary>
public IEnumerable<Student> Students { get; set; }
/// <summary>
/// 注册IStudentRepository服务。通过这项服务知道如何查询学生列表
/// </summary>
/// <param name="studentRepository"></param>
public IndexModel(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
}
/// <summary>
/// 此方法处理发送GET请求 到路由 /Students/Index
/// </summary>
public void OnGet()
{
Students = _studentRepository.GetAllStudents();
}
}
}
错误:无法解析服务
此时,如果我们运行项目并导航到/Students/Index
,我们将收到以下错误。
InvalidOperationException: Unable to resolve service for type 'YoYoMooc.StudentManagement.Services.IStudentRepository' while attempting to activate 'YoYoMooc.StudentManagement.RazorPage.Pages.Students.IndexModel'.
这是因为,当有人请求IStudentRepository时,ASP.NET Core 依赖注入容器不知道要提供哪个服务实例。
以下是Index.cshtml.cs文件中的构造函数
/// <summary>
/// 注册IStudentRepository服务。通过这项服务知道如何查询学生列表
/// </summary>
/// <param name="studentRepository"></param>
public IndexModel(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
}
我们正在使用构造函数注入IStudentRepository
服务,但是ASP.NET Core 不知道要提供什么服务实例。 所以它会失败,并返回异常信息。
注册服务
我们希望ASP.NET Core 在请求IStudentRepository
接口时提供MockStudentRepository
类的实例。为了告诉ASP.NET Core 依赖注入系统,我们使用依赖注入容器注册接口(即IStudentRepository)和实现该接口的具体类(即MockStudentRepository)。我们在Stratup
类的ConfigureServices()
方法中执行此操作。
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddSingleton<IStudentRepository, MockStudentRepository>();
}
目前注册服务,我们正在使用AddSingleton()方法。除了AddSingleton()之外,我们还有AddTransient()和AddScoped()方法。在面向初学者的ASP.NET Core MVC教程的第44部分中,我们详细讨论了这些方法之间的差异。
此时,运行项目并导航到/Students/Index
。该页面将毫无例外地显示。
在下一个视频中,我们将讨论如何显示学生列表。