WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(二)(下)

简介: WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(二)(下)

3. 创建控制器

接口控制器就是客户端访问的入口,与接口服务对应,一个四个接口控制器,如下所示:

学生控制器StudentController

学生控制器封装学生操作的服务,包括学生的增删改查的接口,如下所示:

1. namespace SIMS.WebApi.Controllers
2. {
3. /// <summary>
4. /// 学生控制器
5. /// </summary>
6.     [Route("api/[controller]/[action]")]
7.     [ApiController]
8. public class StudentController : ControllerBase
9.     {
10. private readonly ILogger<StudentController> logger;
11. 
12. private readonly IStudentAppService studentAppService;
13. 
14. public StudentController(ILogger<StudentController> logger, IStudentAppService studentAppService) {
15. this.logger = logger;
16. this.studentAppService = studentAppService;
17.         }
18. 
19. /// <summary>
20. /// 学生列表,带分页
21. /// </summary>
22. /// <param name="pageNum"></param>
23. /// <param name="pageSize"></param>
24. /// <param name="no"></param>
25. /// <param name="name"></param>
26. /// <returns></returns>
27.         [HttpGet]
28. public PagedRequest<StudentEntity> GetStudents(int pageNum, int pageSize,string? no = null ,string? name=null ) {
29. return studentAppService.GetStudents(no,name, pageNum, pageSize);
30.         }
31. 
32. /// <summary>
33. /// 查询某一班级的学生列表
34. /// </summary>
35. /// <param name="classId"></param>
36. /// <returns></returns>
37.         [HttpGet]
38. public PagedRequest<StudentEntity> GetStudentsByClasses(int classId) {
39. return studentAppService.GetStudentsByClasses(classId);
40.         }
41. 
42. /// <summary>
43. /// 获取学生信息
44. /// </summary>
45. /// <param name="id"></param>
46. /// <returns></returns>
47.         [HttpGet]
48. public StudentEntity GetStudent(int id) {
49. return studentAppService.GetSudent(id);
50.         }
51. 
52. /// <summary>
53. /// 新增学生
54. /// </summary>
55. /// <param name="student"></param>
56. /// <returns></returns>
57.         [HttpPost]
58. public int AddStudent(StudentEntity student)
59.         {
60. return studentAppService.AddStudent(student);
61.         }
62. 
63. /// <summary>
64. /// 修改学生
65. /// </summary>
66. /// <param name="student"></param>
67. /// <returns></returns>
68.         [HttpPut]
69. public int UpdateStudent(StudentEntity student) {
70. return studentAppService.UpdateStudent(student);
71.         }
72. 
73. /// <summary>
74. /// 删除学生
75. /// </summary>
76. /// <param name="id"></param>
77.         [HttpDelete]
78. public int DeleteStudent(int id)
79.         {
80. return studentAppService.DeleteStudent(id);
81.         }
82.     }
83. }

班级控制器ClassesController

班级控制器是对班级接口服务的封装,包含对班级的增删改查,如下所示:

1. namespace SIMS.WebApi.Controllers
2. {
3. /// <summary>
4. /// 班级控制器
5. /// </summary>
6.     [Route("api/[controller]/[action]")]
7.     [ApiController]
8. public class ClassesController : ControllerBase
9.     {
10. private readonly ILogger<ClassesController> logger;
11. 
12. private readonly IClassesAppService classesAppService;
13. 
14. public ClassesController(ILogger<ClassesController> logger, IClassesAppService classesAppService)
15.         {
16. this.logger = logger;
17. this.classesAppService = classesAppService;
18.         }
19. 
20. /// <summary>
21. /// 获取班级信息
22. /// </summary>
23. /// <param name="id"></param>
24. /// <returns></returns>
25.         [HttpGet]
26. public ClassesEntity GetClasses(int id)
27.         {
28. return classesAppService.GetClasses(id);
29.         }
30. 
31. /// <summary>
32. /// 获取班级列表
33. /// </summary>
34. /// <param name="id"></param>
35. /// <returns></returns>
36.         [HttpGet]
37. public PagedRequest<ClassesEntity> GetClassess(string? dept, string? grade, int pageNum, int pageSize)
38.         {
39. return classesAppService.GetClassess(dept,grade,pageNum,pageSize);
40.         }
41. 
42. /// <summary>
43. /// 新增班级
44. /// </summary>
45. /// <param name="classes"></param>
46. /// <returns></returns>
47.         [HttpPost]
48. public int AddClasses(ClassesEntity classes)
49.         {
50. return classesAppService.AddClasses(classes);
51.         }
52. 
53. /// <summary>
54. /// 修改班级
55. /// </summary>
56. /// <param name="classes"></param>
57. /// <returns></returns>
58.         [HttpPut]
59. public int UpdateClasses(ClassesEntity classes)
60.         {
61. return classesAppService.UpdateClasses(classes);
62.         }
63. 
64. /// <summary>
65. /// 删除班级
66. /// </summary>
67. /// <param name="id"></param>
68.         [HttpDelete]
69. public int DeleteClasses(int id)
70.         {
71. return classesAppService.DeleteClasses(id);
72.         }
73.     }
74. }

注意:其他控制器,暂是代码不全,暂不贴示。

通过以上示例可以看出,接口服务依赖DataContext,控制器依赖接口服务,那么如果要使程序得以运行,就要逐层创建对象,并传递对象实体。手工创建非常不方便,所以就需要引入Autofac进行自动注入,如下所示:

4. 注入DataContext

在Program中,通过构造器,注入DataContext,如下所示:

builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

注意:Default为appsetting.json中配置的数据库连接字符串。如下所示:

1. {
2. "Logging": {
3. "LogLevel": {
4. "Default": "Information",
5. "Microsoft.AspNetCore": "Warning"
6.     }
7.   },
8. "ConnectionStrings": {
9. "Default": "Server=localhost;Database=SIMS;Trusted_Connection=True;User Id=sa;Password=abc123"
10.   },
11. "AllowedHosts": "*"
12. }

5. 配置Autofac框架

Autoface框架可以实现接口的自动注入,减少繁琐的人工操作,如下所示:

1. // 以下是autofac依赖注入
2. builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
3. builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
4. {   // 注入Service程序集
5. string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
6.     builder.RegisterAssemblyTypes(Assembly.Load(assemblyName))
7.     .AsImplementedInterfaces()
8.     .InstancePerDependency();
9. });

Program中全部代码,如下所示:

1. using Autofac;
2. using Autofac.Extensions.DependencyInjection;
3. using Microsoft.EntityFrameworkCore;
4. using SIMS.WebApi;
5. using SIMS.WebApi.Data;
6. using SIMS.WebApi.Services.Student;
7. using System.Configuration;
8. using System.Reflection;
9. 
10. var builder = WebApplication.CreateBuilder(args);
11. 
12. // Add services to the container.
13. 
14. builder.Services.AddControllers();
15. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
16. builder.Services.AddEndpointsApiExplorer();
17. builder.Services.AddSwaggerGen();
18. builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
19. // 以下是autofac依赖注入
20. builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
21. builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
22. {   // 注入Service程序集
23. string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
24.     builder.RegisterAssemblyTypes(Assembly.Load(assemblyName))
25.     .AsImplementedInterfaces()
26.     .InstancePerDependency();
27. });
28. var app = builder.Build();
29. 
30. // Configure the HTTP request pipeline.
31. if (app.Environment.IsDevelopment())
32. {
33.     app.UseSwagger();
34.     app.UseSwaggerUI();
35. }
36. 
37. app.UseHttpsRedirection();
38. 
39. app.UseAuthorization();
40. 
41. app.MapControllers();
42. 
43. app.Run();

6. 代码结构

WebApi中代码结构如下所示:

 

7. 运行WebApi服务

经过以上步骤的操作,Api接口已经基本搭建完成,将SIMS.WebApi作为启动项目,运行VS,如下所示:

8. 接口测试

默认情况下WebApi继承了Swagger,可以进行简单的测试,以/api/Classes/GetClasses为例,输入班级ID,就可查询班级信息,如下所示:

以上就是本次的主要内容,包含数据库的基本操作和WebApi接口的创建流程,旨在抛转引玉,一起学习,共同进步。

备注

上邪【作者】佚名 【朝代】汉

上邪,我欲与君相知,长命无绝衰。

山无陵,江水为竭。

冬雷震震,夏雨雪。

天地合,乃敢与君绝。

相关文章
|
15天前
|
SQL 中间件 C#
一个使用 WPF 开发的管理系统
一个使用 WPF 开发的管理系统
|
15天前
|
网络协议 网络安全 C#
基于 WPF 开发的简约,功能强大的终端模拟器
基于 WPF 开发的简约,功能强大的终端模拟器 前言今天大姚给大家推荐一款基于 WPF 开发的简约,功能强大的终端模拟器:ModengTerm。项目介绍ModengTerm是一款基于 WPF 开发的简约,功能强大的终端模拟器,可以用来连接SSH服务器,串口,TCP服务器,Windows命令行等。项目功能支持与SSH服务器,串口,Windows命令行进行交互。可以保存会话信息,方便下次直接登录。支持将终端内容导出为txt和html格式。根据关键字/正则表达式进行历史记录的查找。同步输入功能、历史记录、度可定制化的颜色主题、实时记录日志功能等。项目源码运行设置ModengTerm为启动项目运行:
|
4月前
|
C# 开发者 Windows
WPF 应用程序开发:一分钟入门
本文介绍 Windows Presentation Foundation (WPF),这是一种用于构建高质量、可缩放的 Windows 桌面应用程序的框架,支持 XAML 语言,方便 UI 设计与逻辑分离。文章涵盖 WPF 基础概念、代码示例,并深入探讨常见问题及解决方案,包括数据绑定、控件样式与模板、布局管理等方面,帮助开发者高效掌握 WPF 开发技巧。
181 65
|
3月前
|
设计模式 前端开发 C#
使用 Prism 框架实现导航.NET 6.0 + WPF
使用 Prism 框架实现导航.NET 6.0 + WPF
136 10
|
5月前
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
194 1
|
5月前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
143 0
|
5月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
138 0
|
5月前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
75 0
|
5月前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
265 0
|
5月前
|
开发者 C# 自然语言处理
WPF开发者必读:掌握多语言应用程序开发秘籍,带你玩转WPF国际化支持!
【8月更文挑战第31天】随着全球化的加速,开发多语言应用程序成为趋势。WPF作为一种强大的图形界面技术,提供了优秀的国际化支持,包括资源文件存储、本地化处理及用户界面元素本地化。本文将介绍WPF国际化的实现方法,通过示例代码展示如何创建和绑定资源文件,并设置应用程序语言环境,帮助开发者轻松实现多语言应用开发,满足不同地区用户的需求。
102 0