1. 程式人生 > 其它 >Asp.Net Core 控制反轉生命週期 學習

Asp.Net Core 控制反轉生命週期 學習

using System;
using Microsoft.Extensions.DependencyInjection;//匯入控制反轉中介軟體
namespace IOC
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();//服務集合

            //新增服務 *************************
            /// services.AddTransient
<TestService1>(); //1.瞬態 拿到2個物件 ///services.AddSingleton<TestService1>();//2.單例 同一個物件 services.AddScoped<TestService1>(); //3.範圍 //實現IDisposable介面 using 防止資源洩露 //ServiceProvider==服務定位器 **************************************** using
( ServiceProvider provider = services.BuildServiceProvider()) { /* TestService1 t1= provider.GetService<TestService1>();//向 服務定位器要服務 t1.Name = "sasa"; t1.SayHi(); TestService1 t2 = provider.GetService<TestService1>();//向 服務定位器要服務 Console.WriteLine(object.ReferenceEquals(t1,t2)); t2.Name = "okok"; t2.SayHi(); t1.SayHi();
*/ TestService1 f1; using (IServiceScope scope = provider.CreateScope()) //3.範圍 { //在scope中獲取Scope相關的物件, scope.ServiceProvider 而不是provider // scope.ServiceProvider.GetRequiredService TestService1 t1= scope.ServiceProvider.GetService<TestService1>();//向 服務定位器要服務 t1.Name = "sasa"; t1.SayHi(); TestService1 t2 = scope.ServiceProvider.GetService<TestService1>();//向 服務定位器要服務 Console.WriteLine(object.ReferenceEquals(t1, t2)); f1 = t1; } using (IServiceScope scope2 = provider.CreateScope()) //3.範圍 範圍內是同對象 出就不是一個物件 { //在scope中獲取Scope相關的物件, scope2.ServiceProvider 而不是provider // scope.ServiceProvider.GetRequiredService TestService1 t1 = scope2.ServiceProvider.GetService<TestService1>();//向 服務定位器要服務 t1.Name = "sasa"; t1.SayHi(); TestService1 t2 = scope2.ServiceProvider.GetService<TestService1>();//向 服務定位器要服務 Console.WriteLine(object.ReferenceEquals(t1, t2)); Console.WriteLine(object.ReferenceEquals(f1, t2)); } Console.Read(); } } public interface ITestService { public string Name { get; set; } public void SayHi(); } //如果類實現IDisposable介面離開作用域會自動呼叫 public class TestService1 : ITestService,IDisposable { public string Name { get; set; } public void Dispose() { Console.WriteLine("*********"); } public void SayHi() { Console.WriteLine($"Hello {Name}"); } } public class TestService2 : ITestService { public string Name { get; set; } public void SayHi() { Console.WriteLine($"Hello World!{Name}"); } } } }