当前位置: 首页 > news >正文

ASP.NET MVC-构建服务层+注入服务

环境:
win10, .NET 6.0,IIS


目录

  • 问题描述
  • 实现效果
  • 实现
    • 项目结构
    • 安装Unity.Mvc
    • 实现服务层
    • 配置Unity
    • 修改Global.asax
    • 注入服务
    • 修改视图

问题描述

在 ASP.NET MVC 项目中,将业务逻辑从控制器(Controller)中拆分到**服务层(Service Layer)**是一种常见的架构设计模式。这种设计模式可以提高代码的可维护性、可测试性和可复用性。

现在假设我需要将控制器中酶相关的逻辑放到服务层,以期尽可能降低控制器的长度和复杂度。

实现效果

假设服务层有一个函数是GetMsg()(返回一个字符串,内容为"EnzymesService.GetMsg()"),控制器会在Index()中调用,并将返回的结果显示到Index.cshtml中。实现效果:
在这里插入图片描述
调用成功。

实现

下面的实现只给出部分代码,剩余请自行补足。

项目结构

/Controllers
    HomeController.cs
/Services
    EnzymesService.cs
    IEnzymesService.cs
/Models
    Enzymes.cs
/Views
    /Home
        Index.cshtml

安装Unity.Mvc

在 ASP.NET MVC 中,通常使用 Unity、Autofac 或 Ninject 等依赖注入容器。

我选择用NuGet安装Unity.Mvc。
在这里插入图片描述

实现服务层

// IEnzymesService.cs
/// <summary>
/// 定义与酶相关的服务接口
/// </summary>
public interface IEnzymesService {
	string GetMsg();
}

// EnzymesService.cs
public class EnzymesService : IEnzymesService {
	public string GetMsg() { 
		return "EnzymesService.GetMsg()";
	}
}

配置Unity

找到UnityConfig.cs
在这里插入图片描述
修改:

public static class UnityConfig {
	// ...
	public static void RegisterComponents()
	{
    	var container = new UnityContainer();

    	// 注册服务
    	container.RegisterType<IEnzymesService, EnzymesService>();

    	// 将容器设置为 MVC 的默认依赖解析器
    	System.Web.Mvc.DependencyResolver.SetResolver(new UnityDependencyResolver(container));
	}
}

修改Global.asax

修改Application_Start(),增加:

// 配置依赖注入
UnityConfig.RegisterComponents();

注入服务

修改控制器:

public class HomeController : Controller
{
    private readonly EnzymesService enzymesService;

    /// <summary>
    /// 通过构造函数注入依赖
    /// </summary>
    /// <param name="enzymesService"></param>
    public HomeController(EnzymesService enzymesService)
    {
        this.enzymesService = enzymesService;
    }

    public ActionResult Index()
    {
    	// 调用服务
        var msg = enzymesService.GetMsg();
        ViewBag.Message = msg;
        return View();
    }
	
	// ...
}

修改视图

增加:

<h2>@ViewBag.Message</h2>

相关文章:

  • GC 频率和触发条件
  • Unity光线追踪移动端降级适配技术指南
  • Vue.js 状态管理:从本地状态到全局状态管理
  • 深入理解 Maven BOM 及其继承特性
  • 在Linux中安装Nginx
  • HarmonyOS NEXT - 电商App实例四(登录界面)
  • Unity Timeline 扩展
  • 【langchain/入门】使用langchain调用本地部署的大模型(以llama.cpp以及ollama为例)
  • maxkb安装部署
  • 企业的应用系统
  • 第四章 podman桌面版使用及Portainer UI的安装使用
  • maxwell
  • Ubuntu 24.04 Rootless Docker 安装指南
  • 动态参数二维码统计:构建APP渠道追踪体系
  • DeepSeek-R1 面试 -—— GRPO
  • 使用联核科技四向穿梭车能给企业带来哪些效益?
  • LeetCode 第4题:寻找两个正序数组的中位数
  • Linux的chmod命令,给文件设置权限
  • 【Agent实战】货物上架位置推荐助手(RAG方式+结构化prompt(CoT)+API工具结合ChatGPT4o能力Agent项目实践)
  • STC89C52单片机学习——第17节: [7-1]定时器
  • 超新星|罚丢点球的那道坎,刘诚宇靠自己迈了过去
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等
  • 第一集丨《亲爱的仇敌》和《姜颂》,都有耐人寻味的“她”
  • 首映丨纪录电影《滚烫年华》:献给所有奋斗者
  • 巴基斯坦总理:希望通过和平对话方式解决与印方问题
  • 重庆荣昌区委区政府再设“答谢宴”,邀请800余名志愿者机关食堂用餐