依赖注入概念

依赖注入概念#

概念

image-20250306195215336

image-20250306200751766

image-20250306200833767

image-20250306201124725

image-20250306201335119

例子:

接口image-20250306202016006

两个实现类:

image-20250306202040348

image-20250306202056114

image-20250306202532662

image-20250306202902251

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddTransient<TestServiceImpl>();
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {
                TestServiceImpl testService= sp.GetService<TestServiceImpl>();
                testService.Name = "test";
                testService.SayHi();
            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

生命周期

image-20250306203326474

瞬时的:
image-20250306203712244

image-20250306203732638

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddTransient<TestServiceImpl>();
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {
                TestServiceImpl t= sp.GetService<TestServiceImpl>();
                t.Name = "test";
                t.SayHi();

                TestServiceImpl t1 = sp.GetService<TestServiceImpl>();
                t1.Name = "你好";
                t1.SayHi();
                Console.WriteLine(object.ReferenceEquals(t, t1));

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306203830643

image-20250306203840137

单例的:

image-20250306203926713

image-20250306203938097

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            services.AddSingleton<TestServiceImpl>();
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {
                TestServiceImpl t= sp.GetService<TestServiceImpl>();
                t.Name = "test";
                t.SayHi();

                TestServiceImpl t1 = sp.GetService<TestServiceImpl>();
                t1.Name = "你好";
                t1.SayHi();
                Console.WriteLine(object.ReferenceEquals(t, t1));

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

Scope:

T=T1(仅在一个范围相同)

image-20250306204517438

image-20250306204702802

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped<TestServiceImpl>();
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {
                using (IServiceScope scopel = sp.CreateScope()) 
                {
                    TestServiceImpl t = scopel.ServiceProvider.GetService<TestServiceImpl>();
                    t.Name = "test";
                    t.SayHi();

                    TestServiceImpl t1 = scopel.ServiceProvider.GetService<TestServiceImpl>();
                    t1.Name = "你好";
                    t1.SayHi();
                    Console.WriteLine(object.ReferenceEquals(t, t1));
                }



                using (IServiceScope scope2 = sp.CreateScope())
                {
                    TestServiceImpl t2 = scope2.ServiceProvider.GetService<TestServiceImpl>();
                    t2.Name = "test";
                    t2.SayHi();

                    TestServiceImpl t3 = scope2.ServiceProvider.GetService<TestServiceImpl>();
                    t3.Name = "test";
                    t3.SayHi();

                    Console.WriteLine(object.ReferenceEquals(t2, t3));
                }
                
            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

scopel和scope2的对象不同:

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped<TestServiceImpl>();
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {
                TestServiceImpl tt;
                using (IServiceScope scopel = sp.CreateScope()) 
                {
                    TestServiceImpl t = scopel.ServiceProvider.GetService<TestServiceImpl>();
                    t.Name = "test";
                    t.SayHi();

                    TestServiceImpl t1 = scopel.ServiceProvider.GetService<TestServiceImpl>();
                    t1.Name = "你好";
                    t1.SayHi();
                    tt = t;
                    //Console.WriteLine(object.ReferenceEquals(t, t1));
                }



                using (IServiceScope scope2 = sp.CreateScope())
                {
                    TestServiceImpl t2 = scope2.ServiceProvider.GetService<TestServiceImpl>();
                    t2.Name = "test";
                    t2.SayHi();

                    TestServiceImpl t3 = scope2.ServiceProvider.GetService<TestServiceImpl>();
                    t3.Name = "test";
                    t3.SayHi();

                    //Console.WriteLine(object.ReferenceEquals(t2, t3));
                    Console.WriteLine(object.ReferenceEquals(tt, t3));
                }
                
            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306205730413

<服务类型,实现类型>

image-20250306210018540

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped<ITestService,TestServiceImpl>();
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {
               
                using (IServiceScope scopel = sp.CreateScope())
				{
    				ITestService t = scopel.ServiceProvider.GetService<ITestService>();
   					 t.Name = "test";
    				t.SayHi();
				}
                
            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306210255858

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped(typeof(ITestService), typeof(TestServiceImpl));
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
               
                using (IServiceScope scopel = sp.CreateScope())
                {
                    ITestService t = scopel.ServiceProvider.GetService<ITestService>();
                    t.Name = "test";
                    t.SayHi();

                    
                    //Console.WriteLine(object.ReferenceEquals(t, t1));
                }



                

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306210351680

using Microsoft.Extensions.DependencyInjection;
using static System.Formats.Asn1.AsnWriter;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddSingleton(typeof(ITestService), new TestServiceImpl());
            using (ServiceProvider sp  = services.BuildServiceProvider())
            {

                ITestService t = sp.GetService<ITestService>();
                t.Name = "test";
                t.SayHi();
                //TestServiceImpl tt;
                //using (IServiceScope scopel = sp.CreateScope()) 
                //{
                //    TestServiceImpl t = scopel.ServiceProvider.GetService<TestServiceImpl>();
                //    t.Name = "test";
                //    t.SayHi();

                //    TestServiceImpl t1 = scopel.ServiceProvider.GetService<TestServiceImpl>();
                //    t1.Name = "你好";
                //    t1.SayHi();
                //    tt = t;
                //    //Console.WriteLine(object.ReferenceEquals(t, t1));
                //}



                //using (IServiceScope scope2 = sp.CreateScope())
                //{
                //    TestServiceImpl t2 = scope2.ServiceProvider.GetService<TestServiceImpl>();
                //    t2.Name = "test";
                //    t2.SayHi();

                //    TestServiceImpl t3 = scope2.ServiceProvider.GetService<TestServiceImpl>();
                //    t3.Name = "test";
                //    t3.SayHi();

                //    //Console.WriteLine(object.ReferenceEquals(t2, t3));
                //    Console.WriteLine(object.ReferenceEquals(tt, t3));
                //}

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306210417991

image-20250306210557401

image-20250306210701046

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped(typeof(ITestService), typeof(TestServiceImpl));
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
               
                
                
                    ITestService t = (ITestService)sp.GetService(typeof(ITestService));
                    t.Name = "tom";
                    t.SayHi();

                    
                    //Console.WriteLine(object.ReferenceEquals(t, t1));
                



                

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306210852799

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped(typeof(ITestService), typeof(TestServiceImpl));
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                              
                    ITestService t = sp.GetRequiredService<ITestService>();
                    t.Name = "tom";
                    t.SayHi();

                    
                    //Console.WriteLine(object.ReferenceEquals(t, t1));
                



                

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306210928287

getservices:

image-20250306211257572

image-20250306211204988

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped<ITestService,TestServiceImpl>();
            services.AddScoped<ITestService,TestServiceImpl2>();
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                              
                IEnumerable<ITestService> test = sp.GetServices<ITestService>();
                foreach (ITestService t in test)
                { 
                    Console.WriteLine(t.GetType());
                
                }
                    
                    
                    //Console.WriteLine(object.ReferenceEquals(t, t1));
                



                

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

如果只获得一个,以最后一个为准:

image-20250306211434818

using Microsoft.Extensions.DependencyInjection;
namespace ioc1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            services.AddScoped<ITestService,TestServiceImpl>();
            services.AddScoped<ITestService,TestServiceImpl2>();
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                              
                    ITestService t = sp.GetRequiredService<ITestService>();
                    t.Name = "tom";
                    t.SayHi();

                    
                    //Console.WriteLine(object.ReferenceEquals(t, t1));
                



                

            }
        }
    }
}

public interface ITestService
{
    public string Name { get; set; }
    public 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}");
    }
}

image-20250306211451268

image-20250306211602935

image-20250306212132622

image-20250306212143466

image-20250306212157787

image-20250306212237970

image-20250306212321187

image-20250306212934495

image-20250306213156977

image-20250306213230540

image-20250306213407578


using Microsoft.Extensions.DependencyInjection;
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddScoped<Controller>();
            services.AddScoped<ILog,LogImpl>();
            services.AddScoped<IStorage, StorageImpl>();
            services.AddScoped<IConfig, ConfigImpl>();
            using (var sp = services.BuildServiceProvider())
            {
                var c = sp.GetRequiredService<Controller>();
                c.Test();
            }
        }
    }
}

class Controller 
{ 
    private readonly ILog log;
    private readonly IStorage storage;

    public Controller(ILog log,IStorage storage)
    {
        this.log = log;
        this.storage = storage;
    }

    public void Test() 
    {
        this.log.Log("开始上传");
        this.storage.Save("ddddd", "1.txt");
        this.log.Log("完毕");

    }


}
interface ILog 
{ 
    public void Log(string msg);

}
class LogImpl : ILog
{
    public void Log(string msg)
    {
        Console.WriteLine(msg);
    }
}

interface IConfig
{
    public string GetValue(string name);
}
class ConfigImpl : IConfig
{
    public string GetValue(string name)
    {
        return "hello";
    }
}

interface IStorage
{
    public void Save(string content,string name);
}

class StorageImpl : IStorage
{   
    private readonly IConfig config;
    public StorageImpl(IConfig config)
    {
        this.config = config;
    }

    public void  Save(string content, string name)
    {
        string server = config.GetValue(name);
        Console.WriteLine(content,server);
    }
}


如果有一天,config变了,只需要:
image-20250306214140151

image-20250306214304685



using Microsoft.Extensions.DependencyInjection;
namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddScoped<Controller>();
            services.AddScoped<ILog,LogImpl>();
            services.AddScoped<IStorage, StorageImpl>();
            services.AddScoped<IConfig, DBConfigImpl>();
            using (var sp = services.BuildServiceProvider())
            {
                var c = sp.GetRequiredService<Controller>();
                c.Test();
            }
        }
    }
}

class Controller 
{ 
    private readonly ILog log;
    private readonly IStorage storage;

    public Controller(ILog log,IStorage storage)
    {
        this.log = log;
        this.storage = storage;
    }

    public void Test()      
    {
        log.Log("开始上传");
        storage.Save("ddddd", "1.txt");
        log.Log("完毕");

    }


}
interface ILog 
{ 
    public void Log(string msg);

}
class LogImpl : ILog
{
    public void Log(string msg)
    {
        Console.WriteLine(msg);
    }
}

interface IConfig
{
    public string GetValue(string name);
}
class ConfigImpl : IConfig
{
    public string GetValue(string name)
    {
        Console.WriteLine("hello");
        return "hello";
    }
}
class DBConfigImpl : IConfig
{
    public string GetValue(string name)
    {
        Console.WriteLine("你好");
        return "你好";
    }
}



interface IStorage
{
    public void Save(string content,string name);
}

class StorageImpl : IStorage
{   
    private readonly IConfig config;
    public StorageImpl(IConfig config)
    {
        this.config = config;
    }

    public void  Save(string content, string name)
    {
        string server = config.GetValue(name);
        
        Console.WriteLine(content,server);
    }
}




作者:suehoo

出处:https://www.cnblogs.com/suehoo/p/18756740

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   suehoo  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu