南昌做网站比较好的公司有哪些,网站短信验证怎么做,国外工装设计网站大全,开发公司名字#x1f680;简介
依赖注入#xff08;Dependency Injection#xff0c;简称DI#xff09;是一种实现控制反转#xff08;IoC#xff09;的技术#xff0c;用于减少代码之间的耦合度。通过依赖注入#xff0c;一个类可以从外部获取其依赖的对象#xff0c;而不是自己…简介
依赖注入Dependency Injection简称DI是一种实现控制反转IoC的技术用于减少代码之间的耦合度。通过依赖注入一个类可以从外部获取其依赖的对象而不是自己创建。这样可以使得代码更加模块化更易于测试和维护。
依赖注入的生命周期主要有以下三种
Transient每次请求都会创建一个新的实例。这是最常见的生命周期选项。Scoped在同一次请求中始终返回同一实例。如果在不同的请求中将会创建一个新的实例。Singleton每次请求都返回同一个实例即在首次请求时创建的实例。
安装NuGet包
首先我们先安装 Microsoft.Extensions.DependencyInjection这是Microsoft提供的依赖注入框架。 Transient
创建一个类包含一个属性Name和一个方法SayHi
public class TestServicesImp
{public string Name { get; set; }public void SayHi(){Console.WriteLine(Hello:Name);}
}
通过ServiceCollection创建了一个服务容器然后通过AddTransient方法将TestServicesImp类型注册到这个服务容器中。这里使用的是瞬时生命周期也就是每次从容器中获取TestServicesImp类型时都会创建一个新的实例。
public class Program
{public static void Main(string[] args){var serviceCollection new ServiceCollection();serviceCollection.AddTransientTestServicesImp();using (ServiceProvider sp serviceCollection.BuildServiceProvider()){var t1 sp.GetServiceTestServicesImp();t1.Name 张三;t1.SayHi();var t2 sp.GetServiceTestServicesImp();t2.Name 李四;t2.SayHi();var referenceEquals object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}
}
运行结果因为在瞬时生命周期中每次获取服务都会创建新的实例。 因此通过object.ReferenceEquals方法比较了t1和t2是否是同一个实例结果会输出false Scoped
我们将上面代码中的服务注册AddTransient方法换成AddScoped,然后t2.SayHi();换成t1.SayHi();再试一次。 public static void Main(string[] args){var serviceCollection new ServiceCollection();serviceCollection.AddScopedTestServicesImp();using (ServiceProvider sp serviceCollection.BuildServiceProvider()){var t1 sp.GetServiceTestServicesImp();t1.Name 张三;t1.SayHi();var t2 sp.GetServiceTestServicesImp();t2.Name 李四;t1.SayHi();var referenceEquals object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}
发现这次的比较结果为true并且第二次调用SayHi也是使用t1但依然输出了李四因此可以得出两次获取服务得到的是同一个实例。 我们对代码再进行改造一下创建一个新的服务作用域通过这个作用域的ServiceProvider对象获取了另一个TestServicesImp的实例t2。 public static void Main(string[] args){var serviceCollection new ServiceCollection();serviceCollection.AddScopedTestServicesImp();using (ServiceProvider sp serviceCollection.BuildServiceProvider()){var t1 sp.GetServiceTestServicesImp();t1.Name 张三;using (IServiceScope scope sp.CreateScope()){var t2 scope.ServiceProvider.GetServiceTestServicesImp();t2.Name 李四;t1.SayHi();t2.SayHi();var referenceEquals object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}}
因为它们是在不同的Scope中获取的所以这次的结果是false Singleton
我们将服务注册AddScoped方法换成AddSingleton然后再执行一次 public static void Main(string[] args){var serviceCollection new ServiceCollection();serviceCollection.AddSingletonTestServicesImp();using (ServiceProvider sp serviceCollection.BuildServiceProvider()){var t1 sp.GetServiceTestServicesImp();t1.Name 张三;using (IServiceScope scope sp.CreateScope()){var t2 scope.ServiceProvider.GetServiceTestServicesImp();t2.Name 李四;t1.SayHi();t2.SayHi();var referenceEquals object.ReferenceEquals(t1, t2);Console.WriteLine(referenceEquals);}}}
在输出结果中很显然可以看出使用AddSingleton注册服务每次请求都返回同一个实例