首页WIN11问题内置IOC容器ServiceCollection

内置IOC容器ServiceCollection

时间2022-11-04 08:45:04发布分享专员分类WIN11问题浏览87

.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;

内置IOC容器ServiceCollection

瞬时

结果如下:

内置IOC容器ServiceCollection

瞬时结果 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;

内置IOC容器ServiceCollection

单例 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>;

内置IOC容器ServiceCollection

新的作用域

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>;

内置IOC容器ServiceCollection

注意:由于是控制台项目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 。

引用链接

爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

ServiceCollectio容器IOCServiceCollectioIOCmicrosoft net framework 2 0
怎么生成exe文? 浅入 .NET Core 中的内存和GC知识