IOC/DI概念简述及基本应用

早几年面试时,面试官经常问我依赖注入的概念,但有面试官自己都不是很清楚ioc和di的区别,而是草草归于一类,今天翻了翻以前写的demo,顺便把这部分概念整理出来,加深一下印象。

先科普一下,IOC是什么

IOC(Inversion of Control)又称控制反转,它并不是指某种技术实现,而是OOP的一种设计原则。

这个概念基础不牢靠的同学很多都是和DI混淆的,包括我曾经遇到几个面试官也是这样(面试过程极其尴尬),这里着重强调。

为什么叫控制反转?传统程序设计中,我们经常使用 new 创建对象,这种做法是我们主动去创建依赖对象,可以理解为“正转”。

如果把创建对象(new)的操作移交给某个程序(IOC容器)来控制,就理解为“反转”。也就是说,就是把创建对象交给IOC容器去做,将控制权反转给IOC容器。

什么是DI

DI(Dependency Injection)又称依赖注入,是IOC的一种实现方式。

言简意赅的讲,由容器动态创建依赖关系并注入到组件中去。依赖注入并不能给程序带来更多功能,却可以提升组件重用率、系统可扩展性,让程序更灵活。

.Net Core的实现

net core自带IOC容器(也许你听过这一句:一切皆注入),只需要简单配置即可使用。

先新建一个core项目,然后编写接口和实现类:

public interface IProduct
{
    void Get();
}
    
public class Product : IProduct
{
    public void Get()
    {
         throw new NotImplementedException();
    }
}

之后进入Startup进行配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IProduct, Product>();
} 

接下来是代码环节:

public class Test
{
    private IProduct Pro { get; set; }

    public UserController(IProduct pro)
    {
        Pro = pro;
    }

    public void Get()
    {
        //实现
        Pro.Get();
    }
}

别走,还没完

还有一个点需要注意,那就是生命周期。一般来说,既然问到了IOC,那么生命周期必然也会引出,所以一定要搞清楚。

生命周期有三种:

(单例模式)Singleton:首次请求创建,之后所有请求都沿用这个已创建的服务。

(瞬态模式)Transient:每次请求都创建,上面的代码里就是这种模式。

(作用域模式)Scoped:每次请求创建,同一个请求内不管调用多少次都只会被创建一次。

//瞬态
services.AddTransient<IProduct, Product>();

//作用域
services.AddScoped<IProduct, Product>();

//单例
services.AddSingleton<IProduct, Product>();

希望对大家有帮助。

猜你喜欢

转载自www.cnblogs.com/muchengqingxin/p/13190147.html