依赖注入概念
依赖注入概念#
概念
例子:
两个实现类:
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}");
}
}
生命周期
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}");
}
}
单例的:
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(仅在一个范围相同)
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}");
}
}
<服务类型,实现类型>
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}");
}
}
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}");
}
}
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}");
}
}
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}");
}
}
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}");
}
}
getservices:
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}");
}
}
如果只获得一个,以最后一个为准:
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}");
}
}
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);
}
}
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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现