ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期.
这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.
目录
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
今天我们主要讲讲如何使用自带IOC容器,emm..虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库..
在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码.
比如,在我们的Startup类中的ConfigureServices里,就可以看到:
AddMvc AddDbContext 包括我们之前目录游览用到的AddDirectoryBrowser..
都是框架提供好的服务,我们直接注入就可以使用了.
1.如何注入自己的服务
下面我们就来讲讲如何注入自己的服务.
首先,我们编写我们自己的测试服务如下:
public class TestService: ITestService
{
public TestService()
{
MyProperty = Guid.NewGuid();
}
public Guid MyProperty { get; set; }
public List<string> GetList(string a)
{
return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
}
}
编写对应的接口代码如下:
public interface ITestService
{
Guid MyProperty { get; }
List<string> GetList(string a);
}
然后,我们要在Startup类引用 Microsoft.Extensions.DependencyInjection(ps,这命名已经很直白了..微软..扩展...依赖注入 - - ,)
修改ConfigureServices方法,如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDbContext<BloggingContext>();
//这里就是注入服务
services.AddTransient<ITestService, TestService>();
services.AddDirectoryBrowser();
}
AddTransient就是注入的方法之一,泛型参数,前面一个是你服务的接口,第二个是服务的实现类..
这样,我们就完成了初步的注入操作.
那么我们如何使用我们注入的服务呢?
我们到控制器,编写代码如下:
public class DITestController : Controller
{
private readonly ITestService _testService;
public DITestController(ITestService testService)
{
_testService = testService;
}
public IActionResult Index()
{
ViewBag.date = _testService.GetList("");
return View();
}
}
注入的方式一般有三种,构造函数注入, 方法注入,属性注入..微软自带的这个IOC容器,默认采用了构造函数注入的方式(不支持属性注入,不过可以用第三方容器替换来实现,下篇讲)
我们编写我们的index视图如下:
@{
ViewData["Title"] = "Index";
} <h2>Index</h2>
@foreach (var item in ViewBag.date)
{ <h2>@item</h2>
}
最终效果如下:
2.注入服务的生命周期
微软给自行注入的服务,提供了3种生命周期.
Transient(瞬时的)
每次请求时都会创建的瞬时生命周期服务。这个生命周期最适合轻量级,无状态的服务。
Scoped(作用域的)
在同作用域,服务每个请求只创建一次。
Singleton(唯一的)
全局只创建一次,第一次被请求的时候被创建,然后就一直使用这一个.
如何使用这三种生命周期呢?.我们直接在注入的时候用不同的方法就行了,代码如下:
services.AddTransient<ITestService, TestService>();
services.AddScoped<ITestService2, TestService2>();
services.AddSingleton<ITestService3, TestService3>();
下面,我们就来测试一下这三种生命周期的具体生成情况
我们编写三个不同名称的接口如下:
public interface ITestService
{
Guid MyProperty { get; }
List<string> GetList(string a);
}
public interface ITestService2
{
Guid MyProperty { get; }
List<string> GetList();
}
public interface ITestService3
{
Guid MyProperty { get; }
List<string> GetList();
}
然后用3个类来分别实现他们.
public class TestService: ITestService
{
public TestService()
{
MyProperty = Guid.NewGuid();
}
public Guid MyProperty { get; set; }
public List<string> GetList(string a)
{
return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
}
} public class TestService2 : ITestService2
{
public TestService2()
{
MyProperty = Guid.NewGuid();
}
public Guid MyProperty { get; set; }
public List<string> GetList()
{
return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
}
}
public class TestService3 : ITestService3
{ public TestService3()
{
MyProperty = Guid.NewGuid();
}
public Guid MyProperty { get; set; }
public List<string> GetList()
{
return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
}
}
每个实现类的构造函数中,我们都产生了一个新的guid,通过这个GUID,我们可以判断这个类到底重新执行过构造函数没有.
我们编写注入代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDbContext<BloggingContext>();
services.AddTransient<ITestService, TestService>();
services.AddScoped<ITestService2, TestService2>();
services.AddSingleton<ITestService3, TestService3>();
services.AddDirectoryBrowser();
}
我们修改控制器如下:
public class DITestController : Controller
{ private readonly ITestService _testService;
private readonly ITestService2 _testService2;
private readonly ITestService3 _testService3;
public DITestController(ITestService testService, ITestService2 testService2, ITestService3 testService3)
{
_testService = testService;
_testService2 = testService2;
_testService3 = testService3;
}
//这里采用了Action注入的方法
public IActionResult Index([FromServices]ITestService testService11, [FromServices]ITestService2 testService22)
{
ViewBag.date = _testService.GetList("");
ViewBag.guid = _testService.MyProperty;
ViewBag.guid11 = testService11.MyProperty;
ViewBag.guid2 = _testService2.MyProperty;
ViewBag.guid22 = testService22.MyProperty;
ViewBag.guid3 = _testService3.MyProperty;
return View();
}
}
这里说明一下,我们采用了Action注入的方法,新注入了一个ITestService2 ,来保证2个ITestService2 在同一个作用域.
我们编写相关的index页面,来展示这些信息如下:
@{
ViewData["Title"] = "Index";
} <h2>Index</h2>
@foreach (var item in ViewBag.date)
{ <h2>@item</h2>
} <h1>瞬时的:@ViewBag.guid</h1>
<h1>瞬时的2:@ViewBag.guid11</h1>
<h1>作用域的:@ViewBag.guid2</h1>
<h1>作用域的2:@ViewBag.guid22</h1>
<h1>全局唯一的:@ViewBag.guid3</h1>
我们运行代码,第一次访问,效果如下:
我们发现瞬时生命周期的,2次生成的GUID都不一致,说明对象不是同一个.
然而作用域生命周期的,因为在同一个作用域下,2次使用服务的GUID都是一致的,说明用的同一个对象.
我们直接刷新页面进行第二次访问.
效果如下:
瞬时的和作用域的,都继续符合我们的预期,
全局唯一生命周期的和上面第一次访问的GUID保持一致.说明2次访问,都使用的同一个对象.也符合我们的预期.
本篇到此就结束了,下篇我们讲解,如何使用第三方的Autofac来替换我们默认的IOC容器,并且使用Autofac的属性注入,来注入我们的服务. 喜欢的请点个推荐和关注,~有问题也希望各位批评指正~.
ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)的更多相关文章
- ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
- 在ASP.NET Core中怎么使用HttpContext.Current
一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...
- ASP.NET Core 中文文档
ASP.NET Core 中文文档 翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先 ...
- Asp.Net Core 中获取应用程序物理路径(Getting the Web Root Path and the Content Root Path in ASP.NET Core)
如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...
随机推荐
- vue-router实例
最近刚刚用vue写了个公司项目,使用vue-cli构建的,算是中大型项目吧,然后这里想记录并且分享一下其中的知识点,希望对大家有帮助,后期会逐渐分享:话不多说,直接上代码!! main.js // T ...
- 这么说吧,java线程池的实现原理其实很简单
好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...
- linux下脚本做成服务
一.脚本做成服务 1.把启动脚本复制到 /etc/init.d目录中 2.脚本内容 xxxx代表jar包名称 #!/usr/bin/env bash # chkconfig: 2345 20 80 # ...
- java 正则学习
前言 在网上找了许多关于正则解析 URL,结果不是很满意,所以自己学习正则: java url 那么解析 url 的代码如下: import java.util.regex.Matcher; impo ...
- 【CSS3】定位
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- DataBase MongoDB高级知识-易使用
MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...
- python for循环巧妙运用(迭代、列表生成式)
200 ? "200px" : this.width)!important;} --> 介绍 我们可以通过for循环来迭代list.tuple.dict.set.字符串,di ...
- scala写算法-用小根堆解决topK
topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...
- 深入JS原型与原型链
要了解原型和原型链,首先要理解普通对象和函数对象. 一.普通对象和函数对象的区别 在Javascript的世界里,全都是对象,而对象之间也是存在区别,我们首先区分一下普通对象和函数对象,如下代码: f ...
- 安装supervisord
一:简介 supervisord是一个进程管理工具,提供web页面管理,能对进程进行自动重启等操作. 优点: - 可以将非后台运行程序后台运行 - 自动监控,重启进程 缺点: - 不能管理后台运行程序 ...