栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.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();
            services.AddSingleton();
            services.AddScoped();
        }

其中瞬时的和单例用的比较多,单例比较适用于对数据库进行操作,比如数据库的连接,如果使用瞬时的话,就会出现数据库打开关闭打开关闭,造成资源浪费。
依赖注入的话又要写很多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();
                });

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

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/981643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号