ASP.NET Core 依赖注入系列一

这篇具有很好参考价值的文章主要介绍了ASP.NET Core 依赖注入系列一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是ASP.NET Core 依赖注入? 依赖注入也称DI是一项技术用来实现对象松耦合以至于应用程序更容易维护,ASP.NET Core通过控制器的构造函数自动注入依赖的对象,我们创建ASP.NET Core MVC应用程序演示依赖注入特性是如何工作, 在这节中我们讲解该特性

1 例子

我们创建一个ASP.NET Core MVC的应用程序

1.1 Repository

新建一个Product实体类,为了简单我们将数据存储在应用程序的内存中而不是数据库中,在Models中添加Products类,代码如下

namespace AspNetCore.DependencyInjection.Models{    public class Product    {        public string Name { get; set; }        public decimal Price { get; set; }    }}

接下来,在Models文件夹下创建一个接口名字为IRepository,这个接口中包含了最基本的方法新增,读取和删除产品,接口的代码如下:

namespace AspNetCore.DependencyInjection.Models{    public interface IRepository    {        IEnumerable<Product> Products { get; }        Product this[string name] { get; }        void AddProduct(Product product);        void DeleteProduct(Product product);    }}

现在我们在Models文件夹下创建一个Repository类继承自IRepository接口

namespace AspNetCore.DependencyInjection.Models{    public class Repository : IRepository    {        private Dictionary<string, Product> products;        public Repository()        {            products = new Dictionary<string, Product>();            new List<Product> {                new Product { Name = "Women Shoes", Price = 99M },                new Product { Name = "Skirts", Price = 29.99M },                new Product { Name = "Pants", Price = 40.5M }            }.ForEach(p => AddProduct(p));        }        public IEnumerable<Product> Products => products.Values;        public Product this[string name] => products[name];        public void AddProduct(Product product) => products[product.Name] = product;        public void DeleteProduct(Product product) => products.Remove(product.Name);    }}

我们在Dictionary中创建了3条数据,在该类中实现了接口中的所有成员

1.2 Controller & Views

我们修改一下HomeController.cs文件将我们的产品显示在视图上,因此更新Index方法

namespace AspNetCore.DependencyInjection.Controllers{    public class HomeController : Controller    {        public IActionResult Index()        {            return View(new Repository().Products);        }    }}

可以清楚的看到在Index方法中,创建一个Repository实例并且调用了Products属性(new Repository().Products), 这个属性返回字典中存储的所有产品,我们最后将这些数据返回到视图

HomeController以紧耦合方式依赖Repository类,我们使用依赖注入技术实现松耦合

我们现在更新一下Views->Home的Index视图:

@{    ViewData["Title"] = "Home Page";}@model IEnumerable<Product><div class="row mb-3">    <div class="col-sm">        <table class="table table-bordered align-middle">            <thead>                <tr>                    <th>名称</th>                    <th>价格</th>                </tr>            </thead>            <tbody>                @foreach (var product in Model)                {                    <tr>                        <td>@product.Name</td>                        <td>@string.Format("{0:C2}",product.Price)</td>                    </tr>                }            </tbody>        </table>    </div></div>

这个视图通过循环Model中的数据读取产品信息,显示所有的产品在表格中,运行应用程序我们将看到3个产品信息

ASP.NET Core 依赖注入系列一

2 使用DI来解决紧耦合

如果你看到控制器中代码你将发现紧耦合Repository.cs类,原因是我们直接创建了一个Repository对象使用下面代码:

return View(new Repository().Products);

假设一段时间后我们需求发生一些变化,我们需要将repository改变为NewRepository,因此我们需要修改控制器中的代码:

public IActionResult Index(){    return View(new NewRepository().Products);}

这是一个如何管理紧耦合组件的问题,我们为什么避开紧耦合组件?

1 它给项目维护带来了很多问题,如果一个组件改变会影响另外一个组件

2 对这些组件进行单元测试时会出现很多问题

依赖注入技术解决了这些问题,ASP.NET Core 会为控制器自动提供repository对象,这将移除紧耦合的问题

3 在控制器中实现依赖注入

如何在ASP.NET Core中实现依赖注入? 我们可以通过注册服务来解决这个问题,ASP.NET Core DI将解析依赖,在ASP.NET Core 控制器中2个步骤可以实现DI

1 移除控制器中紧耦合,添加新松耦合的依赖

2 新的依赖在ASP.NET Core 中如何解析

首先我们创建一个松耦合的依赖在控制器中,这个我们将实现一个接口并且在控制器中使用这个接口,更新一下HomeController代码因此使用这个接口来创建依赖,代码如下:

namespace AspNetCore.DependencyInjection.Controllers{    public class HomeController : Controller    {        private IRepository _repository;        public HomeController(IRepository repository)        {            _repository= repository;        }        public IActionResult Index()        {            return View(new Repository().Products);        }    }}

我们在控制器中做了2件事情

1 在控制器中添加接口IRepository

2 添加了一个构造函数,构造函数的参数是接口类型,在构造函数中我们使用构造函数参数设置接口变量的值

使用这个我们可以添加松耦合依赖在构造函数,现在你的action方法可以访问IRepository接口的方法

最后我们需要告诉ASP.NET Core 如何解析IRepository接口依赖,进入应用程序的Program.cs文件并且为DI容器注册新的服务,我们将通过下面代码完成这个工作

​​​​​​​

using AspNetCore.DependencyInjection.Models;var builder = WebApplication.CreateBuilder(args);builder.Services.AddTransient<IRepository, Repository>();// Add services to the container.builder.Services.AddControllersWithViews();var app = builder.Build();

现在运行应用程序,你将会看到产品显示在页面上,这里我们使用了DI将控制器和Repository类解耦,假设在一段时间后我们需要从另外一个类NewRepository.cs展示产品,你只需要修改一下下面代码就可以了

builder.Services.AddTransient<IRepository, NewRepository>()

4 依赖注入针对单个类型

如果你有一个简单的类没有实现任何接口,该类是一个简单类型,让我们了解如何在这个例子中使用DI,在Models文件夹中创建一个新的类叫ProductSum.cs并添加如下代码

namespace AspNetCore.DependencyInjection.Models{    public class ProductSum    {        public IRepository Repository { get; set; }        public ProductSum(IRepository repo)        {            Repository = repo;        }        public decimal Total => Repository.Products.Sum(p => p.Price);    }}

注意这个类没有实现任何接口,在构造函数中指定一个IRepository依赖,有一个Total的属性,返回Repository类所有产品的总和,这个类依赖IRepository接口通过ServiceProvider来解析,我们在之前已经做了配置

在HomeController的构造函数中创建一个ProductSum类的依赖,并且设置一个ViewBag变量包含所有产品的总和,这个ViewBag值将显示在视图,更新HomeController的代码:

namespace AspNetCore.DependencyInjection.Controllers{    public class HomeController : Controller    {        private IRepository _repository;        private ProductSum _productSum;        public HomeController(IRepository repository, ProductSum productSum)        {            _repository = repository;            _productSum = productSum;        }        public IActionResult Index()        {            return View(new Repository().Products);        }    }}

在Program类中添加下面代码:

using AspNetCore.DependencyInjection.Models;var builder = WebApplication.CreateBuilder(args);builder.Services.AddTransient<IRepository, Repository>();builder.Services.AddTransient<ProductSum>();// Add services to the container.builder.Services.AddControllersWithViews();var app = builder.Build();

在这里我们使用了AddTransient()只有一个参数,以这种方式告诉ServiceProvider初始化ProductSum类并解析这个类型的依赖,这个依赖注入单个类型,没有任何接口

ASP.NET Core 依赖注入系列一

 文章来源地址https://www.toymoban.com/news/detail-502871.html

 

 

到了这里,关于ASP.NET Core 依赖注入系列一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .Net Core核心概念——依赖注入和中间件

    1. 为什么要用依赖注入(DI) 什么是依赖注入,为什么要使用呢?简单通俗说就是一个类需要另一个类来协助工作,就产生了依赖,所以需要的依赖项就要【注入】过来一起来协同完成工作。 软件设计原则中有一个依赖倒置原则(DIP)讲的是要依赖于抽象,不要依赖于具体,高层

    2024年02月08日
    浏览(52)
  • 【C#】.net core 6.0 依赖注入生命周期

    给自己一个目标,然后坚持一段时间,总会有收获和感悟! 对于.net core而言,依赖注入生命周期有三种瞬态(Transient)、作用域(Scoped)和单例(Singleton),无论使用哪种生命周期,都需要确保对象的线程安全性,并正确地处理依赖关系。 在了解依赖注入的生命周期前,我

    2024年02月03日
    浏览(53)
  • .Net6 Web Core API 配置 Autofac 封装 --- 依赖注入

    目录 一、NuGet 包导入 二、Autofac 封装类 三、Autofac 使用 四、案例测试 下列封装 采取 程序集注入方法 , 单个依赖注入, 也适用, 可依赖注入的地方配置 Autofac Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy    

    2024年02月14日
    浏览(54)
  • Asp.net Core系列学习(1)

    ASP.NET Core 是一个跨平台的高性能开源 框架 ,用于生成启用云且连接 Internet 的新式应用。 使用 ASP.NET Core,可以: 生成 Web 应用和服务、物联网 (IoT) 应用和移动后端。 在 Windows、macOS 和 Linux 上使用喜爱的开发工具。 部署到云或本地。 在 .NET Core 上运行。 ASP.NET Core 是对 ASP

    2024年02月06日
    浏览(66)
  • ASP.NET Core 配置系列一

    A S P . N E T   C o r e   配 置 主 要 通 过 这 3 个 文 件 设 置 : 1   项 目 文 件 也 叫 . c s p r o j   文 件 2   P r o g r a m . c s 3   a p p s e t t i n g s . j s o n 这 些 配 置 告 诉 A S P . N E T   C o r e   应 用 程 序 基 于 用 户 的 交 互 是 如 何 工 作 的, 在 本 节 中 我 们 理 解 A S P .

    2024年02月03日
    浏览(108)
  • 什么是 ASP.NET Core SignalR?

    所有连接了 Internet 的应用程序都由服务器和客户端组成。 客户端依赖于服务器获取数据,而它们获取数据的主要机制是通过发出超文本传输协议 (HTTP) 请求来进行的。 某些客户端应用程序需要经常更改的数据。 ASP.NET Core SignalR 提供了一个 API,用于创建服务器到客户端远程过

    2024年02月15日
    浏览(42)
  • ASP.NET Core SignalR 系列(二)- 中心(服务端)

    本章将和大家分享 ASP.NET Core SignalR 中的中心(服务端)。 本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hubs?view=aspnetcore-7.0 废话不多说,我们直接来看一个Demo,Demo的目录结构如下所示: 本Demo的Web项目为ASP.NET Core Web 应用程序( 目标框架为.NET 7.0

    2024年02月13日
    浏览(53)
  • Asp .Net Core 系列: 集成 CORS跨域配置

    CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一

    2024年01月24日
    浏览(88)
  • ASP.NET Core SignalR 系列(四)- 中心筛选器

    本章将和大家分享 ASP.NET Core SignalR 中的中心筛选器。 本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hub-filters?view=aspnetcore-7.0 废话不多说,下面我们直接进入本章主题。 中心筛选器: 在 ASP.NET Core 5.0 或更高版本中可用。 允许在客户端调用中心方法之

    2024年02月16日
    浏览(46)
  • 你所不知道的ASP.NET Core进阶系列(三)

    一年多没更新博客,上一次写此系列还是四年前,虽迟但到,没有承诺,主打随性,所以不存在断更,催更,哈哈,上一篇我们细究从请求到绑定详细原理,本篇则是探讨模型绑定细节,当一个问题产生到最终解决时,回过头我们整体分析其产生背景以及设计思路才能有所获

    2024年02月05日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包