前言

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

正文

今天我们主要讲讲如何使用自带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的属性注入,来注入我们的服务.  喜欢的请点个推荐和关注,~有问题也希望各位批评指正~.

原文地址:http://www.cnblogs.com/GuZhenYin/p/8297145.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)相关推荐

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

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

  2. 高性能asp服务器,服务器中让人头疼的防火墙-ASP教程,性能优化

    ############################################################### 本问由雨浪同志苦心编写 请不要到处转载或者改写,谢谢了,做技术不容易 # ...

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

    上一篇ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)我们讲了如何将默认的容器替换为Autofac,并使用属性注入.那么这一篇我们就来讲讲如何利用A ...

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

    上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础 ...

  5. 【C】KoobooJson在asp.net core中的使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/j_teng/article/detail ...

  6. ASP.NET Core 中文文档 第三章 原理(5)错误处理

    原文:Error Handling 作者:Steve Smith 翻译:谢炀(Kiler) 校对:高嵩(jack2gs).何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法 ...

  7. ASP.NET Core中使用GraphQL - 第七章 Mutation

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

  8. KoobooJson在asp.net core中的使用

    "KoobooJson是一款体积小巧没有任何依赖且性能表现强劲的Json工具"  详细介绍可以参考官方说明,项目地址:https://github.com/Kooboo/Json ...

  9. ASP.NET Core中使用GraphQL - 最终章 Data Loader

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

最新文章

  1. R语言构建xgboost模型:使用xgb.DMatrix保存、加载数据集、使用getinfo函数抽取xgb.DMatrix结构中的数据
  2. Java FAQ(6)
  3. jfinal配置rails的数据表
  4. 【转】iOS类似Android上toast效果
  5. 区块链教程(二):基础概念介绍
  6. python变量_Python变量
  7. 简记SqueezeNet
  8. 6.6 BERT家族02——sentence-BERT、BioBERT
  9. iOS多线程(一):GCD的基本使用
  10. C语言中 两个分号啥意思,问什么C程序里总是提示缺少分号;,而明明有分号?...
  11. 微商新传奇奢瑞小黑裙、两家小程序内测成员都来这了,SDCC2016微信开发专题议题揭晓...
  12. 真懂?Retrofit完整剖析
  13. /node_modules/.bin/vue-cli-service: Permission denied
  14. 【EasyUI篇】Combo自定义下拉框组件
  15. 学习Linux命令(11) startx
  16. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Gavin大咖免费公益课程Rasa Paper论文解析核心版
  17. 改变世界 VS 娱乐自己
  18. Chart.js入门:简介
  19. 基于 xterm + websocket + vue 实现网页版终端 terminal
  20. 【攻破css系列——第九天】常规流

热门文章

  1. AI+时代,谈谈产品经理对图像识别技术的阈值控制
  2. Java工程转换为Maven工程-b
  3. 也来谈谈这致命的手机充电器
  4. 最好的FLV视频下载器 维棠 (支持优酷视频下载、土豆视频下载等)
  5. 搞定WordPress的日志自动截断
  6. C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
  7. 浅谈C#更改令牌ChangeToken
  8. .NET WebSocket 核心原理初体验
  9. 一个情怀引发的生产事故(续)
  10. VS也可以这样进行快捷安装