内置IOC容器ServiceCollection
.NetCore内置IOC容器ServiceCollection 一、IOC介绍
IOC:全名( Inversion of Control )-控制反转
IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们可以直接从这个外部容器中去拿,而再也不需要我们去new了,充分体现了DIP(依赖倒置原则),也体现了我们经常挂在嘴边的面向接口编程microsoft net framework 2 0 。
DI:全名( Dependency Injection )-依赖注入
DI意味着将类型之间的依赖关系注入到DI容器中
在之前的 .Net Framework 中并没有集成 IOC microsoft net framework 2 0 ,虽然Microsoft自己有一套"Unity",想要使用IOC+DI时,还需要我们自己去安装包,进行三部曲等等各种操作
比较流行的IOC容器技术:Autofac、Unity、NInjectmicrosoft net framework 2 0 。。。
二、.NetCore内置IOC容器ServiceCollection
1、打开NuGet包管理器microsoft net framework 2 0 ,安装 Microsoft.Extensions.DependencyInjection 包
2、实现代码如下:
publicinterfaceISqlHelper
voidGetAll;
publicclassSqlServerHelper: ISqlHelper
publicvoidGetAll
Console.WriteLine( "this is "+ typeof(SqlServerHelper));
staticvoidMain( string[] args)
ServiceCollection services = newServiceCollection;
services.AddTransient<ISqlHelper, SqlServerHelper>;
varprovider=services.BuildServiceProvider;
varsqlHelper=provider.GetService<ISqlHelper>;
sqlHelper.GetAll;
Console.ReadKey;
运行结果输出: this is SqlServerHelper
当我们在执行业务逻辑时想要写入一些日志( Log )microsoft net framework 2 0 ,必然会当然依赖这个类,那么会形成了 SqlHelper 类与 Log 类之前的依赖关系,我们可以将之前的依赖关系转移到 DI 容器中,也就是依赖注入( DI ),然后在 DI 容器获取服务(对象)
示例代码如下:
publicinterfaceISqlHelper
voidGetAll;
publicclassSqlServerHelper: ISqlHelper
privatereadonlyILog _ilog;
publicSqlServerHelper(ILog ilog)
_ilog = ilog;
publicvoidGetAll
_ilog.LogInfo( $"我在 { typeof(SqlServerHelper).Name} 中microsoft net framework 2 0 ,我是ilog" );
Console.WriteLine( "this is "+ typeof(SqlServerHelper).Name);
publicinterfaceILog
voidLogInfo( stringmsg);
publicclassLog: ILog
publicvoidLogInfo( stringmsg)
Console.WriteLine(msg);
privatestaticvoidMain( string[] args)
services.AddTransient<ILog, Log>; //瞬时注入
services.AddTransient<ISqlHelper, SqlServerHelper>; //瞬时microsoft net framework 2 0 ,每次的实例都是一个新的对象
varprovider = services.BuildServiceProvider; //构建服务提供商
varsqlHelper = provider.GetService<ISqlHelper>; //获取microsoft net framework 2 0 我们需要的服务实例
sqlHelper.GetAll;
Console.ReadKey;
如果如下:
我在SqlServerHelper中microsoft net framework 2 0 ,我是ilog
this is SqlServerHelper 三、组件的生命周期
1、 Transient :瞬时microsoft net framework 2 0 ,每次的实例都是一个新的对象
2、 Singleton :单例microsoft net framework 2 0 ,全局唯一实例
3、 Scoped :作用域microsoft net framework 2 0 ,在一个作用域中唯一实例,比如在 Asp.Net Core 应用程序中一次请求相当于一个 Scoped
Transient:瞬时microsoft net framework 2 0 ,每次的实例都是一个新的对象 ServiceCollection services = newServiceCollection;
services.AddTransient<ILog, Log>;
services.AddTransient<ISqlHelper, SqlServerHelper>;
varprovider = services.BuildServiceProvider;
varsqlHelper = provider.GetService<ISqlHelper>; //首次获取要使用的服务
sqlHelper = provider.GetService<ISqlHelper>; //获取新的服务
sqlHelper.GetAll;
瞬时
结果如下:
瞬时结果 Singleton:单例microsoft net framework 2 0 ,全局唯一实例 ServiceCollection services = newServiceCollection;
services.AddSingleton<ILog, Log>;
services.AddSingleton<ISqlHelper, SqlServerHelper>;
varprovider = services.BuildServiceProvider;
varsqlHelper = provider.GetService<ISqlHelper>;
sqlHelper = provider.GetService<ISqlHelper>;
sqlHelper.GetAll;
Console.ReadKey;
单例 Scoped:作用域microsoft net framework 2 0 ,在一个作用域中唯一实例
一个作用域
ServiceCollection services = new ServiceCollection;
services.AddScoped<ILog, Log>;
services.AddScoped<ISqlHelper, SqlServerHelper>;
var provider = services.BuildServiceProvider;
var scope1 = provider.CreateScope;//在一个作用域下创建第一个子作用域
var sqlHelper = scope1.ServiceProvider.GetService<ISqlHelper>;
新的作用域
ServiceCollection services = new ServiceCollection;
services.AddScoped<ILog, Log>;
services.AddScoped<ISqlHelper, SqlServerHelper>;
var provider = services.BuildServiceProvider;
var scope1 = provider.CreateScope;
//在一个作用域下创建第一个子作用域
var sqlHelper = scope1.ServiceProvider.GetService<ISqlHelper>;
var scope2 = provider.CreateScope;
//在一个作用域下创建第二个子作用域
sqlHelper = scope2.ServiceProvider.GetService<ISqlHelper>;
注意:由于是控制台项目microsoft net framework 2 0 ,只能用子作用域来体现作用域的特点,在web项目中,一次请求就相当于一个作用域
推荐阅读
• 生成条形码二维码DataMatrix条码.EAN码.39码.交叉25码.UPC码.128码.93码.ISBN码.Codabar等
• C#生成二维码的两种快捷方式
• ShellProgressBar控制台中漂亮的显示进度条
• C#10特性试用|全局和隐式usings
资料参考
• ServiceCollection 类 (Microsoft.Extensions.DependencyInjection) | Microsoft Learn [1]
• ASP.NET Core 中的 ServiceProvider - hippieZhou - 博客园 [2]
欢迎关注我的公众号“ Net分享”,技术文章第一时间推送 , 分享一些你可能注意不到的细节microsoft net framework 2 0 。
引用链接
爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。