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

posted @ 2020-05-20 14:35  敖毛毛  阅读(317)  评论(0编辑  收藏  举报