zoukankan      html  css  js  c++  java
  • 重新整理.net core 计1400篇[七] (.net core 中的依赖注入)

    前言

    请阅读第六篇,对于理解.net core 中的依赖注入很关键。

    和我们上一篇不同的是,.net core服务注入保存在IServiceCollection 中,而将集合创建的依赖注入容器体现为IServerProvider。

    具体如何正文中体现。

    正文

    下面是创建的一些实例:

    public interface IFoo { };
    
    public interface IBar { };
    
    public interface IBaz { };
    
    public interface IFoobar<T1, T2> { };
    
    public class Base : IDisposable
    {
    	public Base(){
    		Console.WriteLine($"An instance of {GetType().Name} is created");
    	}
    
    	public void Dispose()
    	{
    		Console.WriteLine($"the instance of {GetType().Name} is disposed");
    	}
    }
    
    public class Foo : Base, IFoo, IDisposable { };
    
    public class Bar : Base, IBar, IDisposable { };
    
    public class Baz : Base, IBaz, IDisposable { };
    
    public class FooBar<T1, T2> : IFoobar<T1, T2>
    {
    	public IFoo Foo { get; }
    
    	public IBar Bar { get; }
    
    	public FooBar(IFoo foo, IBar bar)
    	{
    		Foo = foo;
    		Bar = bar;
    	}
    }
    

    在.net core 中,依赖注入有3三种注入方式,也称作3种生命周期,分别是:transient,scoped,singleton

    transient是瞬息的,是什么意思呢?

    是每次创建容器不是同一个,而是new了一个。

    scoped 是领域的,在同一领域内,也就是同一个IServerProvider中只存在一个相同的容器。

    singleton 这个就是单例了,无论是在任何一个领域内,获取的都是同一个。

    上面的这几种,分别对应了该系列六中的:transient,self,root。

    下面就来用例子展示一下:

    先测试AddScoped:

    var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
    
    var bar=provider.GetService<IBar>();
    
    var bar1 = provider.GetService<IBar>();
    
    if (bar.Equals(bar1))
    {   
         //打印相同
        Console.WriteLine("相同");
    }
    

    上面中将会打印相同,也就是说,其实同一个对象。

    var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
    
    var provider1 = provider.CreateScope().ServiceProvider;
    
    var bar=provider.GetService<IBar>();
    
    var bar1 = provider1 .GetService<IBar>();
    
    if (bar.Equals(bar1))
    {   
        Console.WriteLine("相同");
    }else{
       //打印不同
       Console.WriteLine("不同");
    }
    

    在不是同一个provider 中是不同的。

    测试:AddTransient

    var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
    
    var foo=provider.GetService<IFoo>();
    
    var foo1= provider.GetService<IFoo>();
    
    if (foo.Equals(foo1))
    {   
        Console.WriteLine("相同");
    }else{
       //打印不同
       Console.WriteLine("不同");
    }
    

    说明每次都不同。
    测试singleton:

    var provider = new ServiceCollection().AddTransient<IFoo, Foo>().AddScoped<IBar>(_ => new Bar()).AddSingleton<IBaz, Baz>().BuildServiceProvider();
    
    var provider1 = provider.CreateScope().ServiceProvider();
    
    var Baz=provider.GetService<IBaz>();
    
    var Baz1 = provider1 .GetService<IBaz>();
    
    if (Baz.Equals(Baz1))
    {   
       //打印相同
        Console.WriteLine("相同");
    }else{
       
       Console.WriteLine("不同");
    }
    

    在不同的provider 中获取对象相同。

    总结

    .net core 中的原理在六中已经体现了出来,该章只是简单描述用法,下一章为稍稍深入篇。

  • 相关阅读:
    java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.
    spring-session-data-redis依赖冲突问题
    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod
    图片上传后台服务报内存溢出 Out Of Memory Java heap space
    mysql 数据库密码忘记重置 进行远程连接
    打Jar包
    Type interface com.innovationV2.mapper.UserMapper is not known to the MapperRegistry
    关于java基础类型Integer String的clone()
    clion使用clang编译
    token & refresh token 机制总结
  • 原文地址:https://www.cnblogs.com/aoximin/p/12923470.html
Copyright © 2011-2022 走看看