• 重新整理.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 中的原理在六中已经体现了出来,该章只是简单描述用法,下一章为稍稍深入篇。

  • 相关阅读:
    给a标签加样式的写法
    IE6、IE7下不支持overflowy:hidden;
    fontfamily:微软雅黑
    文字加下划线
    IE8下按钮与右边的距离比IE7和IE6的多了一倍
    在button(div)里设置背景图后,在IE6下背景图的高度被撑开了
    li中包含span,在IE6、IE7下会有3pxbug
    事件冒泡
    [LeetCode] Insert Interval 解题报告
    [LeetCode] Generate Parentheses 解题报告
  • 原文地址:https://www.cnblogs.com/aoximin/p/12923470.html
Copyright © 2020-2023  润新知