Asp.net core中依赖注入的实现
使用服务
在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务:
构造函数
可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式。
public ValuesController(IConfiguration cfg) { //… }
FromService参数
也可以直接在参数中通过FromServiceAttribute引入服务,这个在Controller中用起来非常方便,可以不用再构造函数中加一个变量以保存服务。
[HttpGet] public string Get([FromServices] IConfiguration cfg) { //… }
注入服务
如果要注入我们自己的服务,可以通过如下几步实现:
定义服务接口
在DI框架中,服务一般是面向接口实现的,首先需要定义我们服务的接口:
public interface IMyLogger { void WriteMessage(string message); }
虽然接口定义本身并不是必须的,我们的应用也可以直接依赖于具体的服务对象。但基于良好的设计原则,最好定义接口。
编写服务实现
定义完服务后,就需要编写服务的实现。
public class MyLogger : IMyLogger { public void WriteMessage(string message) { Console.WriteLine(message); } }
注入服务
注入服务一般是通过IServiceCollection.Add方法来实现的。在asp.net core中,一般有如下两个入口可以注入服务。
Startup.ConfigureServices回调函数中注册
public void ConfigureServices(IServiceCollection services) { services.AddScoped<IMyLogger, MyLogger>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
调用IWebHostBuilder.ConfigureServices方法注册
一般会在Main函数中创建WebHost,此时可以主动注册服务。
WebHost.CreateDefaultBuilder(args) .ConfigureServices(service => service.AddScoped<IMyLogger, MyLogger>()) .UseStartup<Startup>();
我这里并没有直接使用IServiceCollection.Add方法注册,而是调用的IServiceCollection.AddScoped扩展方法,它简化了我们服务注册的过程。这个方法有三个:
AddTransient
AddScoped
AddSingleton
这三个方法使用方式类似,它们主要的区别是代表了不同的生命周期:
暂时(Transient) - 每次调用都会创建新实例
作用域(Scoped) - 在调用方生命周期类保持相同实例。(如同一个Controller对象在构造函数中和参数中引入的Scoped对象是相同的)
单例(Singleton) - 在Host内保持唯一
系统自带服务
Asp.net core程序启动的时候,默认就注入了一系列服务
这些服务我们可以直接通过注入的方式使用。另外,一些框架级别的服务(如IServiceProvider,IConfiguration,ILogger<T>等)也是默认可以使用的。
服务容器接口
除了在构造函数中自动获取服务外,我们还可以使用服务容器框架的API构建更为高级的操作,它一般需要用到如下对象:
IServiceProvider 可以在实例中通过依赖注入的方式获取
ActivatorUtilities 辅助构建任务实例
一个简单的示例如下:
using (var scope = services.CreateScope()) { var service = scope.ServiceProvider.GetRequiredService<IMyLogger>(); service.WriteMessage("hello world"); }
这种方式在asp.net core并不常用,因为系统的Web框架已经为我们处理好了大部分功能,但在我们使用通用主机构建自己的后台应用时,这些API就大有用武之地了,限于篇幅这里就不详细介绍了。
在.net core程序中使用
这个依赖注入框架本身并不是.net core的一部分,要在.net core程序中使用它,可以参考我的另一篇文章: .net core程序中使用微软的依赖注入框架。
参考文章
到此这篇关于Asp.net core实现依赖注入的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
解决iis7.5服务器上.net 获取不到https页面的信息
让我纠结了一天多的问题,给大家看下,有相同情况的可以不用浪费时间了,本人当时找了好半天都没找到什么有用的信息,项目在本地没有问题,但部署在服务器后,获取不到https页面的信息,加入下面的代码就可以了,因为iis7.5的安全协议比较高的原因。2014-06-06在ASP.NET Core5.0中访问HttpContext的方法步骤
这篇文章主要介绍了在ASP.NET Core5.0中访问HttpContext的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-11-11asp.net Repeater 数据绑定的具体实现(图文详解)
此例子绑定的数据源为微软在mssql2000中提供的Northwind数据库中的表Categories。2013-07-07ASP.NET中利用WebClient上传图片到远程服务的方法
这篇文章主要介绍了ASP.NET中利用WebClient上传图片到远程服务的方法,包括客户端和服务端,代码附有注释,需要的的朋友参考下吧2017-01-01ASP.NET MVC4 利用uploadify.js多文件上传
本文主要介绍了ASP.NET MVC4利用uploadify.js实现多文件上传的方法代码。具有很好的参考价值。下面跟着小编一起来看下吧2017-03-03
最新评论