.NET Core基础知识-依赖注入(Autofac)

IOC

什么是IOC?IOC是控制反转,是面向对象编程过程中的设计原则,可以用来降低代码之间的耦合性。其中最常见的方式叫做依赖注入。
IOC:调用者不再创建(不自己New)被调用者的实例,而是交给容器去创建,这就是控制反转。
DI:容器创建好的实例再注入调用者的过程,这就叫依赖注入。

控制反转,谁控制谁?

IOC/DI容器控制主程序

控制的是什么?

控制对象本身的创建、实例化;控制对象之间的依赖关系。

何为反转?

应用程序不再主动去创建对象,而是被动等待对象容器给它注入它所需要的资源,所以称之为反转。

反转有什么好处?为什么需要反转?

1.代码之间实现了解耦,提高了资源利用率。
2.便于项目的管理升级和维护。

谁依赖谁?谁注入谁?

应用程序依赖IOC/DI容器,IOC/DI容器注入应用程序。

.Net Core的容器

1…Net Core自带容器

2.Autofac

.Net Core自带容器

1.AddTransient:瞬时的,每次访问构造一个
2.AddSingleton:单例,全局只有一个,类似于全局变量
3.AddScoped:在同个作用域,每个请求只创建一次

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<ITaskSendService, TaskSendService>();
            services.AddSingleton<ITaskSendService, TaskSendService>();
            services.AddScoped<ITaskSendService, TaskSendService>();
        }

其中瞬时的和单例用的比较多,单例比较适用于对数据库进行操作,比如数据库的连接,如果使用瞬时的话,就会出现数据库打开关闭打开关闭,造成资源浪费。
依赖注入的话又要写很多Services.Add…,有人会问有没有什么比较好的方法嘛,我有个朋友把所有的Services.Add…封装成了一个方法,然后在方法里面一行一行的写Services.Add…,这……

Autofac

为了解决很多行Services.Add…的问题,我推荐一个第三方容器-Autofac
那Autofac是怎么使用呢?

1.引入Autofac包

我们在这里引入这两个包

2.添加Autofac容器
public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())//添加Autofac容器
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

在这里插入图片描述

3.在Startup进行注入
        //Autofac容器注入
        public void ConfigureContainer(ContainerBuilder builder)
        {
        //可以一条条进行注入
            builder.RegisterType<TaskSendService>().As<ITaskSendService>();
        }

提供了一个ConfigureContainer方法,您可以使用Autofac单独注册,而不是使用ServiceCollection注册。
有人会说这样也是一条条添加和原生的差不多嘛,为何要多此一举使用第三方Autofac呢,其实Autofac功能比较强大的,只是在这里没有展示出来。
那么说一下,怎么样可以轻松的实现注入呢。

Autofac程序集扫描

//Autofac容器注入
        public void ConfigureContainer(ContainerBuilder builder)
        {
            //builder.RegisterType<TaskSendService>().As<ITaskSendService>();//注入
            Assembly assembly = Assembly.GetExecutingAssembly();//获取当前运行的程序集
            builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.EndsWith("abc"))
                .AsImplementedInterfaces();//EndsWith()判断当前字符串是否是以指定的子字符串结尾的
            //这样的话,所有结尾为abc的就被注入进去了,这个功能比较常用,避免了一条条注入
        }

通过扫描程序集注入,我们可以达到避免一条一条注入的烦恼,这个功能也比较实用。如果还有人想说我不喜欢用第三方容器,我就想用原生的,而且不想一条一条的注入有什么好办法没有。
那当然是有!详见下篇,原生.NET Core容器如何进行避免一条一条的注入(下篇内容属于付费内容,所以会使用Autofac就够用了!)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风偷吻云朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值