Core篇——初探依赖注入
目录
1、DI&&IOC简单介绍
2、UML类图中六种关联关系
3、.net core 中DI的使用
4、.net core DI初始化源码初窥
DI&&IOC简单介绍
DI(依赖注入)是实现IOC(控制反转)的一种方式。面向对象设计六大基本原则的依赖倒置原则,高层类不应该依赖于低层类的实现 ,而应该依赖于它的抽象。所以我们现在工作中,经常是构造函数中,注入需要实现的类的接口;IOC描述的是当一个类需要另外一个类时,这个类的实现不应该由它来决定,实现由一个DI容器来实现,并将其注入到这个类中。
UML类图中六种关联关系
顺便复习一波UML类图中的六种关系:

.net core 中DI的使用
.NET Core框架中,默认存在一个DI容器,使用的时候我们只需要将需要将接口服务放入DI容器。 这里,我们创建一个Movie类,引用efcore 添加一个数据库链接上下文。添加一个IMovieService 接口和MovieService 类。代码如下所示
public class ApplicationDbContext:DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
:base(options)
{ }
public DbSet<Movie> Movie { get; set; } }
数据库链接上下文
public class Startup
{
public IConfiguration Configuration { get; set; } public Startup()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json"); //将appsettings 配置文件读入系统配置 Configuration = builder.Build();
}
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("MVCMovieContext")); //添加数据库链接字符串
});
services.AddRouting();
services.AddMvc();
services.AddScoped<IMovieService, MovieService>();//接口服务放入DI容器
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
Startup类
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
Movie类
public interface IMovieService
{
Movie GetMovie(int Id);
}
public class MovieService : IMovieService
{
private readonly ApplicationDbContext _applicationDbContext; public MovieService(ApplicationDbContext applicationDbContext)
{
_applicationDbContext = applicationDbContext;
}
public Movie GetMovie(int Id)
{
var entity = _applicationDbContext.Movie.FirstOrDefault(t => t.ID == Id);
if (entity == null)
return null;
return entity;
}
}
接口以及服务
public class HomeController : Controller
{
private readonly IMovieService _movieService;
public HomeController(IMovieService movieService)
{
_movieService = movieService;
}
public IActionResult Index(int Id)
{
var movie = _movieService.GetMovie(Id);
return View(movie);
}
}
Home控制器代码

这里我们在MovieService中,注入了数据库链接上下文实例;在HomeController 中,注入了IMovieService 。
.net core DI初始化源码初窥

在 .Net Core 框架的Main函数中,
1、WebHost 通过CreateDefaultBuilder 创建一个WebHostBuilder实例。WebHostBuilder调用 Build方法,在Build方法中,调用BuildCommonServices方法返回一个IServiceCollection。这个ServiceCollection是在BuildCommonServices方法中,实例化的一个,然后在实例化的ServiceCollection中加入一些默认的配置(例如HttpContextFactory,IHostingEnvironment)。
拿到IServiceCollection对象后,在Build方法中,对IServiceCollection IServiceCollection和IServiceCollection.ServiceProvider 进行一个初始化操作(Initialize)方法,然后返回WebHost。
2、在Initialize方法中,执行EnsureApplicationServices方法,EnsureApplicationServices中又通过调用EnsureStartup方法,在EnsureStartup中,通过WebHostProvider拿到StartUp实例。EnsureApplicationServices拿到StartUp后调用ConfigureServices方法,参数是ServiceCollection来完成DI。(这也就是我们新建一个项目StartUp 中的ConfigureServices方法,然后各种services.addxxxx(),把接口和服务放入到IserviceCollection)
Jesse博客学习笔记。传送门=》 http://video.jessetalk.cn/
Core篇——初探依赖注入的更多相关文章
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...
- NET Core 中的依赖注入
NET Core 中的依赖注入 [共7篇] 一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...
- 拥抱.NET Core系列:依赖注入(2)
上一篇"拥抱.NET Core系列:依赖注入(1)"大体介绍了服务注册.获取和生命周期,这一篇来做一些补充. 由于内容跨度大(.NET Core.ASP.NET Core),所以文 ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...
- ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】
到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...
随机推荐
- [INS-30131] 执行安装程序验证所需的初始设置失败问题解决,windows下oracle安装步骤
[INS-30131] 执行安装程序验证所需的初始设置失败问题解决,windows下oracle安装步骤 配置: 系统:windows10 数据库:Oracle Database 12c 第 1 版 ...
- 爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)
处理代码 file = "a.srt" fi = open(file, mode='r') a = fi.readline() i = 1 while len(str(a)) != ...
- poj1111 Image Perimeters 广搜
题目大意: 输入一个矩阵,再输入其中一个“X”的位置(从1开始).从该位置向八个方向扩展,如果是“X”就可以并在一起.问最后得到的模块的周长是多少. 解题思路: 按照广搜的思路来做.用一个二维的数组标 ...
- hdu1853 Cyclic Tour 完美匹配 验证模版
题意: 给出n个城市和m条路,每个城市只能经过一次,想要旅游所有的城市,求需要的最小花费(路径的长度). 分析: 做题之前,首先要知道什么是完美匹配.不然题目做了却不知道为什么可以用这个方法来做.完美 ...
- zmodem使用方法
无论有xshell还是secureCRT连接linux的时. 默认都用一个zmodem可以帮助window和linux之间传输文件 很方便和实用的工具. 不过默认是无法使用的 需要安装lrzsz软件 ...
- css3实现动画滚动条
先给大家一张效果图,看似简单,其实实现起来....那也是非常简单的~简单又实用 黑框里面的字体会自动滚动,形成滚动条,可以用于展示和提示,首先我们先要在body里面写上自己想要的文字,比如我想写:感觉 ...
- CDR是什么?CorelDRAW矢量绘图
CorelDRAW是矢量绘图软件 CorelDRAW Graphics Suite是加拿大Corel公司的平面设计软件: CorelDRAW 非凡的设计能力广泛地应用于商标设计.标志制作.模型绘制.插 ...
- MyBatis 基础入门
MyBatis 是一个半自动化的持久层的框架,能让开发者专注SQL本身 JDBC 连接数据库的硬编码问题,通过config,mapper配置文件解决 Mybatis开发需要关注的文件 l POJO类( ...
- 【airtest】报错:requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')),解决方法如下
1. 环境及设备:mac, xcode , iphonex 2. 最近出现一个让人费解的问题,airtest 没跑多长时间,服务就断掉,而且总是报“requests.exceptions.Connec ...
- 各种概念POJO、JAVABEAN、DAO、DTO、PO、VO、BO、SSH、EJB
转自:https://my.oschina.net/pacoyang/blog/151695 POJO(pure old java object)是普通java类,有一些private的参数作为对象的 ...