using Microsoft.Extensions.DependencyInjection;
using System;
namespace ioc1
{
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
//每次请求获取都是新的对象实例
services.AddTransient<ITestService, TestServiceImpl>();
//每次在一个生命周期中请求获取的都是同一个对象
services.AddSingleton<TestServiceImpl2>();
//同一个范围内获取的是同一个对象范围指“{}”再统一个大括号中的对象
services.AddScoped<TestServiceImpl3>();
using( ServiceProvider sp = services.BuildServiceProvider())
{
//GetService如果找不到服务,就返回null
//GetRequiredService:必须的,如果找不到就报异常
//GetServices找到服务的集合;
ITestService t = sp.GetService<ITestService>();
t.Name = "白沙王";
t.SayHi();
ITestService t1 = sp.GetService<ITestService>();
Console.WriteLine(t.GetType());
Console.WriteLine(object.ReferenceEquals(t,t1));
t1.Name = "喜马拉雅";
t1.SayHi();
Console.WriteLine("----------------------");
TestServiceImpl2 t2 = sp.GetService<TestServiceImpl2>();
t2.Name = "白沙王";
t2.SayHi();
TestServiceImpl2 t21 = sp.GetService<TestServiceImpl2>();
Console.WriteLine(object.ReferenceEquals(t2, t21));
t21.Name = "喜马拉雅";
t21.SayHi();
t2.SayHi();
Console.WriteLine("----------------------");
using (IServiceScope scope1 = sp.CreateScope())
{
//再scope中获取scope相关对象,scope.ServiceProvider而不是sp
TestServiceImpl3 t3 = scope1.ServiceProvider.GetService<TestServiceImpl3>();
t3.Name = "白沙王";
t3.SayHi();
TestServiceImpl3 t33 = scope1.ServiceProvider.GetService<TestServiceImpl3>();
t33.Name = "喜马拉雅";
t33.SayHi();
Console.WriteLine(object.ReferenceEquals(t3, t33));
}
}
Console.ReadKey();
}
}
interface ITestService
{
string Name { get; set; }
void SayHi();
}
public class TestServiceImpl : ITestService
{
public string Name { get; set; }
public void SayHi()
{
Console.WriteLine($"Hi,i'm{Name}");
}
}
public class TestServiceImpl2 : ITestService
{
public string Name { get; set ; }
public void SayHi()
{
Console.WriteLine($"你好,我是{Name}");
}
}
public class TestServiceImpl3 : ITestService
{
public string Name { get; set; }
public void SayHi()
{
Console.WriteLine($"you good,我是{Name}");
}
}
}
Nuget添加Microsoft.Extensions.DependencyInjection;引用
1.ServiceCollection services = new ServiceCollection();
这行代码创建了一个新的ServiceCollection
实例。这是.NET Core中用于管理服务(也就是依赖项)的容器。
2.services.AddTransient<TestServiceImpl>();
这行代码向ServiceCollection
中添加了一个名为TestServiceImpl
的临时服务。AddTransient
方法告诉.NET Core在每次请求该服务时创建一个新的实例。这意味着每次从服务提供者获取该服务时,都会得到一个新的TestServiceImpl
实例。
3. using( ServiceProvider sp = services.BuildServiceProvider())
这行代码创建了一个ServiceProvider
实例,该实例是.NET Core中实现依赖注入的实际对象。使用BuildServiceProvider
方法后,你可以使用这个ServiceProvider
实例来获取之前添加的服务。
4. TestServiceImpl t = sp.GetService<TestServiceImpl>();
这行代码使用创建的ServiceProvider
实例sp
来获取一个类型为TestServiceImpl
的服务。由于之前使用的是AddTransient<TestServiceImpl>()
,所以这里会得到一个新的TestServiceImpl
实例。
5. t.Name = "白沙王";
这行代码给获取到的TestServiceImpl
实例的Name
属性赋值,将其设置为"白沙王"。
6. t.SayHi();
这行代码调用TestServiceImpl
实例的SayHi
方法。这个方法可能会输出一些信息,但由于你没有给出TestServiceImpl
类的定义,我无法确定其具体行为。
总的来说,这段代码创建了一个服务,注册到了依赖注入容器中,并从容器中获取这个服务来使用。这是.NET Core应用中常见的依赖注入模式的一个例子。
services.AddSingleton<TestServiceImpl2>();
这行代码向ServiceCollection
中添加了一个名为TestServiceImpl2
的单例服务。这意味着在整个应用程序的生命周期中,只有一个TestServiceImpl2
实例会被创建,并且每次请求该服务时都会返回同一个实例。