前言

本文主要是详解一下在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容器)的更多相关文章

  1. ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  2. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  3. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  4. ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...

  5. 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,这种形 ...

  6. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  7. 在ASP.NET Core中怎么使用HttpContext.Current

    一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...

  8. ASP.NET Core 中文文档

    ASP.NET Core 中文文档 翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先 ...

  9. Asp.Net Core 中获取应用程序物理路径(Getting the Web Root Path and the Content Root Path in ASP.NET Core)

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...

随机推荐

  1. vue-router实例

    最近刚刚用vue写了个公司项目,使用vue-cli构建的,算是中大型项目吧,然后这里想记录并且分享一下其中的知识点,希望对大家有帮助,后期会逐渐分享:话不多说,直接上代码!! main.js // T ...

  2. 这么说吧,java线程池的实现原理其实很简单

    好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...

  3. linux下脚本做成服务

    一.脚本做成服务 1.把启动脚本复制到 /etc/init.d目录中 2.脚本内容 xxxx代表jar包名称 #!/usr/bin/env bash # chkconfig: 2345 20 80 # ...

  4. java 正则学习

    前言 在网上找了许多关于正则解析 URL,结果不是很满意,所以自己学习正则: java url 那么解析 url 的代码如下: import java.util.regex.Matcher; impo ...

  5. 【CSS3】定位

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. DataBase MongoDB高级知识-易使用

    MongoDB高级知识-易使用 mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系模型主要是为了获取更好的扩展性.当然还有其他的一些好处. 与关系型数据库相比,面向文档的数据库不再有 ...

  7. python for循环巧妙运用(迭代、列表生成式)

    200 ? "200px" : this.width)!important;} --> 介绍 我们可以通过for循环来迭代list.tuple.dict.set.字符串,di ...

  8. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

  9. 深入JS原型与原型链

    要了解原型和原型链,首先要理解普通对象和函数对象. 一.普通对象和函数对象的区别 在Javascript的世界里,全都是对象,而对象之间也是存在区别,我们首先区分一下普通对象和函数对象,如下代码: f ...

  10. 安装supervisord

    一:简介 supervisord是一个进程管理工具,提供web页面管理,能对进程进行自动重启等操作. 优点: - 可以将非后台运行程序后台运行 - 自动监控,重启进程 缺点: - 不能管理后台运行程序 ...