前言

首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果。还记得上篇文章中最后提及到,假如服务越来越多怎么处理呢,本篇文章将会带来解决办法。这篇是接上一篇文章的,概念方面的可以参考上一篇文章。

IoC框架

先说说常见的Ioc框架吧。

Autofac: 目前net用的比较多,好多大佬的项目比较优先选择的框架。

Ninject: 已经很少用了,还时在很早的文章中见过。

Unity: 比较常见的了,好多地方有用到的,

Core: Core中自带的,业务逻辑不太复杂的情况下,还是比较方便的。

IoC-Autofac

Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个。

优点:

  • 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用。
  • 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们。
  • XML.Json配置支持。
  • 自动装配。
  • 与Asp.Net MVC 集成。
  • 微软的Orchad开源程序使用的就是Autofac,从该源码可以看出它的方便和强大。

大多数讲Autofac框架的文章中都会提及上面几点优点,可见其框架的优秀。

.NET Core中自带DI的使用

1.首先创建一个 ASP.Net Core Web Api项目(选用的.NET 5.0),整体如下,红色部分为Core中自带DI使用的部分。

2.新建类库项目,分别添加一个接口文件和类文件。

接口:

  1. public interface ISayHelloService
  2. {
  3. string SayHello(string name);
  4. }

类:

  1. public class EnglishSayHelloService : ISayHelloService
  2. {
  3. public string SayHello(string name)
  4. {
  5. return $"Hello,{name}!";
  6. }
  7. }

3.在 Startup 里面的 ConfigureServices 方法内注入。

  1. services.AddScoped<ISayHelloService, EnglishSayHelloService>();

4.然后在控制器中使用刚刚注入的服务。

  1. [Route("api/[controller]/[action]")]
  2. [ApiController]
  3. public class HelloController : ControllerBase
  4. {
  5. public readonly ISayHelloService sayHelloService;
  6. public HelloController(ISayHelloService sayHelloService)
  7. {
  8. this.sayHelloService = sayHelloService;
  9. }
  10. [HttpGet]
  11. public string CoreDI()
  12. {
  13. return sayHelloService.SayHello("CoreDI");
  14. }
  15. }

注意: 路由访问地址,出现404错误时,可能是路由问题,路由可根据自己的实际需要自己在 [Route("api/[controller]/[action]")] 处修改。

5.访问测试。



这里使用的接口测试软件是Postman,Api测试很方便,网上可以搜索到,找不到我到的可以联系我。

Autofac 使用

1.在新建一个ASP.Net Core Web Api项目(选用的.NET 5.0)用于区分前面的Core自带的DI。

2.引用引用 Autofac 的包,看看这下载量,还是很哇塞的

3.在 Program 中改用 Autofac 来实现依赖注入

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateHostBuilder(args).Build().Run();
  6. }
  7. public static IHostBuilder CreateHostBuilder(string[] args) =>
  8. Host.CreateDefaultBuilder(args)
  9. .ConfigureWebHostDefaults(webBuilder =>
  10. {
  11. webBuilder.UseStartup<Startup>();
  12. });
  13. }

4.在 Startup 类中添加方法:ConfigureContainer,注入我们之前的服务。

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. services.AddControllers();
  11. }
  12. //在这里注入
  13. public void ConfigureContainer(ContainerBuilder builder)
  14. {
  15. builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
  16. }
  17. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  18. {
  19. if (env.IsDevelopment())
  20. {
  21. app.UseDeveloperExceptionPage();
  22. }
  23. app.UseRouting();
  24. app.UseAuthorization();
  25. app.UseEndpoints(endpoints =>
  26. {
  27. endpoints.MapControllers();
  28. });
  29. }
  30. }

5.控制器这里基本不需要更改。

  1. [Route("api/[controller]/[action]")]
  2. [ApiController]
  3. public class HelloController : ControllerBase
  4. {
  5. public readonly ISayHelloService sayHelloService;
  6. public HelloController(ISayHelloService sayHelloService)
  7. {
  8. this.sayHelloService = sayHelloService;
  9. }
  10. [HttpGet]
  11. public string CoreDI()
  12. {
  13. return sayHelloService.SayHello("AutofacDI");
  14. }
  15. }

6.运行项目继续用Postman测试接口。



好了关于Autofac的基本使用基本就讲完了,是不是还是挺简单的。

批量注入

简单的几个服务写着还可以接受,当服务到几十个,甚至上百个时,想想就可怕。这就不得不说到批量注入了,Autofac的优势就体现出来了。

1.在服务中分别在添加一个接口,和类。

接口:

  1. public interface IUseAutofacService
  2. {
  3. string UseAutofac(string name);
  4. }

类:

  1. public class UseAutofacService : IUseAutofacService
  2. {
  3. public string UseAutofac(string name)
  4. {
  5. return $"{name}批量注入测试!";
  6. }
  7. }

2.回到我们之前的Startup 类中修改方法:ConfigureContainer。

  1. public void ConfigureContainer(ContainerBuilder builder)
  2. {
  3. //builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
  4. //服务项目程序集
  5. Assembly service = Assembly.Load("Autofac.Service");
  6. //服务接口项目程序集
  7. Assembly iservice = Assembly.Load("Autofac.Service");
  8. builder.RegisterAssemblyTypes(service, iservice).Where(n => n.FullName.EndsWith("Service") && !n.IsAbstract)
  9. .InstancePerLifetimeScope().AsImplementedInterfaces();
  10. }

注意: 如果需要注入的服务没有 IXXXService的接口 ,那么 builder.RegisterAssemblyTypes 就只需要传一个程序集。如果服务与接口同在一个项目,那也是要传两个程序集的。

3.接下来在刚刚的控制器中略作修改。

  1. [Route("api/[controller]/[action]")]
  2. [ApiController]
  3. public class HelloController : ControllerBase
  4. {
  5. public readonly ISayHelloService sayHelloService;
  6. public readonly IUseAutofacService useAutofacService;
  7. public HelloController(ISayHelloService _sayHelloService, IUseAutofacService _useAutofacService)
  8. {
  9. this.sayHelloService = _sayHelloService;
  10. this.useAutofacService = _useAutofacService;
  11. }
  12. [HttpGet]
  13. public string AutofacDI()
  14. {
  15. return sayHelloService.SayHello("AutofacDI");
  16. }
  17. public string BathAutofacDI()
  18. {
  19. var name = sayHelloService.SayHello("AutofacDI");
  20. return useAutofacService.UseAutofac(name);
  21. }
  22. }

4.用Postman测试注入的情况。

ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用的更多相关文章

  1. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  2. .net core学习笔记(3)-依赖注入

    .net core 中使用了大量的依赖注入,对依赖注入一直是一知半解,总想不透,项目中用的是一个网上的开源框架,从底层到web层都是用的构造函数依赖注入. 然后了在继承ActionFilterAttr ...

  3. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  4. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  5. ng2 学习笔记(三)依赖注入与服务

    前两篇文章简单介绍了ng2的一些基础用法,基本和ng1的使用风格差不多,只是写法和开发方式变化比较大. 这一篇,来总结一下ng的依赖注入与服务.官方的教程上是把他分开来讲的,个人感觉放在一起比较容易理 ...

  6. AngularJs 学习笔记(三)依赖注入

    一个对象可以通过三种方式来获取对依赖对象的控制权: 1.在内部创建依赖的对象 2.通过全局变量引用这个依赖对象 3.通过参数进行传递(在这里是通过函数参数) AngularJs通过$injector注 ...

  7. Angularjs学习笔记(三)----依赖注入

    一.定义 如前所述,$scope对象被神秘的注入到了控制器中,实际上,这是因为控制器声明了它需要$scope,所以AngularJS才会创建并注入它.这套依赖管理系统可以这样总结:"为了正常 ...

  8. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  9. .net core程序中使用微软的依赖注入框架

    我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...

随机推荐

  1. 字节跳动基于Apache Hudi构建EB级数据湖实践

    来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...

  2. SpringSecurity入门

    基础 spring security的底层就是一个过滤器链 ExceptionTranslationFilter是一个异常过滤器,用来处理认证授权过程中的异常 UseranmePasswordAuth ...

  3. 笔记本+ubuntu18.04 关闭触摸板touchpad

    方法1: Settings -> Devices -> Mouse&Touchpad -> Touchpad OFF 方法2: 终端运行如下命令 touchpad off:  ...

  4. Python3-sqlalchemy-orm 分组统计

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  5. kubebuilder实战之八:知识点小记

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Linux下sed找出IP中第四位

    ip addr|sed -n '9p'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -nr 's#^.*inet (.*) b ...

  7. Pytest系列(3) - setup和teardown的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 用过unittest的童鞋都 ...

  8. Python入门学习之:10分钟1500访问量

    看效果: 不扯没用的,直接上代码: # author : sunzd # date : 2019/9/01 # position : beijing from fake_useragent impor ...

  9. 判断输入框中输入的日期格式为yyyy-mm-dd和正确的日期

    判断输入框中输入的日期格式为yyyy-mm-dd和正确的日期   function IsDate(str) { //如果是正确的日期格式返回true,否则返回false var regExp; reg ...

  10. 【第十九篇】- Maven NetBeans之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven NetBeans NetBeans 6.7 及更新的版本已经内置了 Maven.对于以前的版本,可在插件管理中心获取 Maven 插件.此例中我们使用的是 NetBeans 6.9. 关于 ...