Author Image

admin

2周前 82

使用三层架构来搭建Razor Pages项目

导航:

在此视频中,我们将讨论如何使用ASP.NET Core 依赖注入容器注册服务。如果您不熟悉依赖项注入的概念,请查阅ASP.NET Core MVC教程的第19部分,该教程适用于初学者。

Razor Pages中的项目参考

目前,在我们的解决方案中有3个项目,

  • YoYoMooc.StudentManagement.RazorPage - 这是 Razor PagesWeb应用程序项目
  • YoYoMooc.StudentManagement.Models -这是一个.Net标准类库项目,其中包含StudentMajorEnum等领域模型。
  • YoYoMooc.StudentManagement.Services-这也是一个.Net标准类库项目,其中包含数据访问服务。 最终,我们希望 Razor PagesWeb应用程序查询并显示学生列表,如下所示。

学生列表

为了使Web应用程序能够做到这一点,它需要同时引用ModelsServices项目。因此,添加对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。该页面将毫无例外地显示。

在下一个视频中,我们将讨论如何显示学生列表。