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就够用了!)。