ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用
前言
首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果。还记得上篇文章中最后提及到,假如服务越来越多怎么处理呢,本篇文章将会带来解决办法。这篇是接上一篇文章的,概念方面的可以参考上一篇文章。
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.新建类库项目,分别添加一个接口文件和类文件。
接口:
public interface ISayHelloService
{
string SayHello(string name);
}
类:
public class EnglishSayHelloService : ISayHelloService
{
public string SayHello(string name)
{
return $"Hello,{name}!";
}
}
3.在 Startup 里面的 ConfigureServices 方法内注入。
services.AddScoped<ISayHelloService, EnglishSayHelloService>();
4.然后在控制器中使用刚刚注入的服务。
[Route("api/[controller]/[action]")]
[ApiController]
public class HelloController : ControllerBase
{
public readonly ISayHelloService sayHelloService;
public HelloController(ISayHelloService sayHelloService)
{
this.sayHelloService = sayHelloService;
}
[HttpGet]
public string CoreDI()
{
return sayHelloService.SayHello("CoreDI");
}
}
注意: 路由访问地址,出现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 来实现依赖注入
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
4.在 Startup 类中添加方法:ConfigureContainer,注入我们之前的服务。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
//在这里注入
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
5.控制器这里基本不需要更改。
[Route("api/[controller]/[action]")]
[ApiController]
public class HelloController : ControllerBase
{
public readonly ISayHelloService sayHelloService;
public HelloController(ISayHelloService sayHelloService)
{
this.sayHelloService = sayHelloService;
}
[HttpGet]
public string CoreDI()
{
return sayHelloService.SayHello("AutofacDI");
}
}
6.运行项目继续用Postman测试接口。
好了关于Autofac的基本使用基本就讲完了,是不是还是挺简单的。
批量注入
简单的几个服务写着还可以接受,当服务到几十个,甚至上百个时,想想就可怕。这就不得不说到批量注入了,Autofac的优势就体现出来了。
1.在服务中分别在添加一个接口,和类。
接口:
public interface IUseAutofacService
{
string UseAutofac(string name);
}
类:
public class UseAutofacService : IUseAutofacService
{
public string UseAutofac(string name)
{
return $"{name}批量注入测试!";
}
}
2.回到我们之前的Startup 类中修改方法:ConfigureContainer。
public void ConfigureContainer(ContainerBuilder builder)
{
//builder.RegisterType<EnglishSayHelloService>().As<ISayHelloService>();
//服务项目程序集
Assembly service = Assembly.Load("Autofac.Service");
//服务接口项目程序集
Assembly iservice = Assembly.Load("Autofac.Service");
builder.RegisterAssemblyTypes(service, iservice).Where(n => n.FullName.EndsWith("Service") && !n.IsAbstract)
.InstancePerLifetimeScope().AsImplementedInterfaces();
}
注意: 如果需要注入的服务没有 IXXXService的接口 ,那么 builder.RegisterAssemblyTypes 就只需要传一个程序集。如果服务与接口同在一个项目,那也是要传两个程序集的。
3.接下来在刚刚的控制器中略作修改。
[Route("api/[controller]/[action]")]
[ApiController]
public class HelloController : ControllerBase
{
public readonly ISayHelloService sayHelloService;
public readonly IUseAutofacService useAutofacService;
public HelloController(ISayHelloService _sayHelloService, IUseAutofacService _useAutofacService)
{
this.sayHelloService = _sayHelloService;
this.useAutofacService = _useAutofacService;
}
[HttpGet]
public string AutofacDI()
{
return sayHelloService.SayHello("AutofacDI");
}
public string BathAutofacDI()
{
var name = sayHelloService.SayHello("AutofacDI");
return useAutofacService.UseAutofac(name);
}
}
4.用Postman测试注入的情况。
ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用的更多相关文章
- Asp.Net Core学习笔记:入门篇
Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...
- .net core学习笔记(3)-依赖注入
.net core 中使用了大量的依赖注入,对依赖注入一直是一知半解,总想不透,项目中用的是一个网上的开源框架,从底层到web层都是用的构造函数依赖注入. 然后了在继承ActionFilterAttr ...
- ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置
前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...
- ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项
前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...
- ng2 学习笔记(三)依赖注入与服务
前两篇文章简单介绍了ng2的一些基础用法,基本和ng1的使用风格差不多,只是写法和开发方式变化比较大. 这一篇,来总结一下ng的依赖注入与服务.官方的教程上是把他分开来讲的,个人感觉放在一起比较容易理 ...
- AngularJs 学习笔记(三)依赖注入
一个对象可以通过三种方式来获取对依赖对象的控制权: 1.在内部创建依赖的对象 2.通过全局变量引用这个依赖对象 3.通过参数进行传递(在这里是通过函数参数) AngularJs通过$injector注 ...
- Angularjs学习笔记(三)----依赖注入
一.定义 如前所述,$scope对象被神秘的注入到了控制器中,实际上,这是因为控制器声明了它需要$scope,所以AngularJS才会创建并注入它.这套依赖管理系统可以这样总结:"为了正常 ...
- ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探
前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...
- .net core程序中使用微软的依赖注入框架
我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...
随机推荐
- 使用dom4工具:增删改xml文件(七)
package dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Attribut ...
- ES6 class——音乐播放器实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 轻松搞定webpack5.x
源码地址:https://gitee.com/cyp926/webpack-project.git "webpack": "^5.46.0", "we ...
- 如何将excel中纵向的转换成横向保证格式不变,
先选定,复制,然后用--编辑---选择性粘贴--转置--确定.试试能不能实现 ,能把文件发过来看一下
- 1.3w字,一文详解死锁!
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...
- 发那科FANUC机器人视频学习教程
82课时的全套发那科机器人视频教程,学完可以掌握发那科机械手的使用和编程,需要的加我微信私私聊.X241602 FANUC 是日本一家专门研究数控系统的公司,成立于1956年.是世界上最大的专业数控系 ...
- Python - 3.8 新特性之仅位置参数 & 仅关键字参数
前置知识 Python 函数:https://www.cnblogs.com/poloyy/p/15092393.html 什么是仅限位置形参 仅限位置形参是 Python 3.8 才有的新特性 新增 ...
- 《通过刷leetcode学习Go语言》之(1):序言
Author : Email : vip_13031075266@163.com Date : 2021.03.07 Version : 北京 C ...
- mysql多次连接后会产生最大失败值
解决办法 可以更改max_connection_errors的值,即提高允许的max_connection_errors的数量 1.进入mysql 1)首先查看该属性设置为多大:命令:show glo ...
- 【第十篇】- Git 远程仓库(Github)之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 远程仓库(Github) Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. 你就需要将数据 ...