菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

依赖注入

6342人阅读 2021/12/20 11:27 总访问:1018555 评论:3 收藏:1 手机
分类: .net core

前言

ASP.NET Core从框架层对依赖注入提供支持。也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式。


控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。


依赖注入示例

接口部分

  1.  //先定义一个电影院的接口
  2.  public interface ICinemaService
  3.     {
  4.         Task<IEnumerable<Cinema>> GetllAllAsync();//查询所有的Cinema值
  5.         Task<Cinema> GetByIdAsync(int id);//查询指定ID的Cinema
  6.         Task AddAsync(Cinema model);//创建Cinema值
  7.     }
  1. //在定义一个电影的接口
  2.  public interface IMovieService
  3.     {
  4.         Task AddAsync(Movie model);
  5.         Task<IEnumerable<Movie>> GetByCinemaAsync(int cinemaId);
  6.     }

实体类部分

  1. //电影院的实体
  2.  public class Cinema
  3.     {
  4.         public int Id { getset; }
  5.         public string Name { getset; }
  6.         public string Location { getset; }//地址
  7.         public int Capacity { getset; }//容纳多少观众
  8.     }
  1.  //电影的实体
  2.     public class Movie
  3.     {
  4.         public int Id { getset; }
  5.         public string Name { getset; }
  6.         public int CinemaId { getset; }
  7.         public string Starring { getset; }
  8.         public DateTime ReleseDate { getset; }
  9.     }
  1.   //售卖情况实体
  2.   public class Sales
  3.     {
  4.         public int CinemaId { getset; }
  5.         public int MovieId { getset; }
  6.         public int AudienceCount { getset; }//卖出多少票
  7.     }

服务实体

  1. //电影院服务实体赋值
  2.  public class CinemaMemoryService : ICinemaService
  3.     {
  4.         private readonly List<Cinema> _cinema = new List<Cinema>();
  5.         public CinemaMemoryService()
  6.         {
  7.             _cinema.Add(new Cinema
  8.             {
  9.                 Name = "天堂电影院",
  10.                 Location = "上海",
  11.                 Capacity = 1000
  12.             });
  13.             _cinema.Add(new Cinema
  14.             {
  15.                 Name = "疯人电影院",
  16.                 Location = "北京",
  17.                 Capacity = 10000
  18.             });
  19.         }
  20.         public Task<IEnumerable<Cinema>> GetllAllAsync()
  21.         {
  22.             return Task.Run(() => _cinema.AsEnumerable());
  23.         }
  24.         public Task<Cinema> GetByIdAsync(int id)
  25.         {
  26.             return Task.Run(() => _cinema.SingleOrDefault(x => x.Id == id));
  27.         }
  28.         public Task AddAsync(Cinema model)
  29.         {
  30.             var maxId = _cinema.Max(x => x.Id);
  31.             model.Id = maxId + 1;
  32.             _cinema.Add(model);
  33.             return Task.CompletedTask;
  34.         }
  35.     }
  1.  //电影实体服务赋值
  2.  public class MovieMemoryService : IMovieService
  3.     {
  4.         private readonly List<Movie> _movies = new List<Movie>();
  5.         public MovieMemoryService()
  6.         {
  7.             _movies.Add(new Movie
  8.             {
  9.                 Id = 1,
  10.                 CinemaId = 1,
  11.                 Name = "这个杀手不太冷",
  12.                 ReleseDate = new DateTime(201811),
  13.                 Starring = "Tommy"
  14.             });
  15.             _movies.Add(new Movie
  16.             {
  17.                 Id = 2,
  18.                 CinemaId = 2,
  19.                 Name = "笑傲江湖",
  20.                 ReleseDate = new DateTime(201811),
  21.                 Starring = "Tommy"
  22.             });
  23.             _movies.Add(new Movie
  24.             {
  25.                 Id = 2,
  26.                 CinemaId = 2,
  27.                 Name = "小萝莉与猴神大叔",
  28.                 ReleseDate = new DateTime(201811),
  29.                 Starring = "Tommy"
  30.             });
  31.         }
  32.         public Task<IEnumerable<Movie>> GetByCinemaAsync(int cinemaId)
  33.         {
  34.             return Task.Run(() => _movies.Where(x => x.CinemaId == cinemaId));
  35.         }
  36.         public Task AddAsync(Movie model)
  37.         {
  38.             var maxId = _movies.Max(x => x.Id);
  39.             model.Id = maxId + 1;
  40.             _movies.Add(model);
  41.             return Task.CompletedTask;
  42.         }
  43.     }

添加好服务过后,在Startup 类中ConfigureServices 方法中添加刚刚写的两个服务

  1.    public void ConfigureServices(IServiceCollection services)
  2.         {
  3.             services.AddControllersWithViews();
  4.             //添加刚刚新建的两个服务
  5.             services.AddSingleton<ICinemaService, CinemaMemoryService>();
  6.             services.AddSingleton<IMovieService, MovieMemoryService>();
  7.         }

最后在控制器中使用 就OK了

  1.   public class HomeController : Controller
  2.     {
  3.     
  4.         private readonly ILogger<HomeController> _logger;
  5.         private readonly ICinemaService _Cinema;
  6.         private readonly IMovieService _Move;
  7.         public HomeController(ILogger<HomeController> logger,ICinemaService Cinema, IMovieService Move)
  8.         {
  9.             _logger = logger;
  10.             _Cinema = Cinema;
  11.             _Move = Move;
  12.         }
  13.         public IActionResult Index()
  14.         {
  15.             return View();
  16.         }
  17.         public IActionResult Privacy()
  18.         {
  19.             return View();
  20.         }
  21.         [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
  22.         public IActionResult Error()
  23.         {
  24.             return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
  25.         }
  26.     }

这样一个依赖注入的流程就算是走完了



评价

剑轩

2021/12/21 9:22:00

补充点[哈哈]依赖注入的注入方式有:构造函数注入,属性注入,FromServices注入,手动获取注入HttpContext.RequestServices.GetService,视图注入@inject

Session:@剑轩好\(^o^)/

2021/12/21 9:53:16 回复

Session:@剑轩还有这么多,等我空下来学习一下

2021/12/21 9:56:18 回复

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

c使用unity实现依赖注入一:依赖注入介绍

依赖注入的简单介绍直接关联是这样滴,耦合性超高的。这里有一个设计原则:依赖于抽象,而不是具体的实现试想一下如果做了...

c使用unity实现依赖注入二:基本使用

使用Unity实现依赖注入的基本步骤:1:需要创建一个容器2:给容器添加类与类之间的关系(控制反转)3: 在需要的地方从容器里...

c使用unity实现依赖注入三:unity常用生命周期

常用的生命周期有瞬时模式,单利模式,每个线程一个对象模式等。一:TransientLifetimeManagerTransientLifetimeManager模...

c使用unity实现依赖注入四:unity配置文件注入

需要用到的配置文件一:先向xml申明一下unity的配置文件所在的实现类&lt;configSections&gt; &lt;sectionname=&quot;unity...

Net Core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...

net core依赖注入

添加注入首先需要添加好一个注入:其实添加好类与类之间的关系,在ConfigureServices中添加注入services.AddTransient&lt;I...

net core过滤器。net core过滤器中获取依赖注入对象。net core过滤器中使用依赖注入。ServiceFilter 

虽然对象都可以直接实例化得到。但是所有的对象依赖关系,都用DI容器去管理,这样后面想要更换对象的时候也非常方便,项目...

net core控制器(控制台)中使用依赖注入

net core中使用的依赖注入默认是:DependencyInjection使用nuget下载:install-package Microsoft.Extensions.DependencyIn...

IOC(控制反转)与DI(依赖注入

IOC与DI都是为了降低类与类之间的耦合度。耦合性耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量...

IOC (控制反转) Dl (依赖注入

IOC:控制反转DI:注入依赖讲解:类与类之间的耦合性我们之间都是用NEW关键之直接实例化,这样耦合性很高,但是修改很麻烦今...

IOC控制反转和DI依赖注入

IOC控制反转 概念:把类与类的控制器交给容器就是控制反转 使用控制反转一般步骤: (1) 准备一个容器(创建一个类) ...

net core手动获取依赖注入对象

耍朋友的时候要像已经结婚了结了婚要当这婚还没结控制器相关中:HttpContext来获取实例HttpContext下有一个RequestedServic...

.net core 使用依赖注入session

tip:net core 2.2版本后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了的使用工具nuget包管理器 添...

NET Core创建EF与依赖注入

第一步:创建一个NET Core项目第二步:使用Nuget(程序包管理控制台)添加EF的依赖输入命令: Install-Package Microsoft.En...