theme: hydrogen
接口实现
相关代码
```
using System;
namespace ioc1 { class Program { static void Main(string[] args) { IService service = new ServiceImpl(); service.Name = "tom"; service.sayHi(); Console.Read(); }
public interface IService
{
public string Name { get; set; }
public void sayHi();
}
public class ServiceImpl : IService
{
public string Name { get; set; }
public void sayHi()
{
Console.WriteLine($"你好。我是{Name}");
}
}
}
} ```
运行结果
服务注册
下载DI包
相关代码
``` using Microsoft.Extensions.DependencyInjection; using System;
namespace ioc1 { class Program { static void Main(string[] args) {
/*IService service = new ServiceImpl();
service.Name = "tom";
service.sayHi();*/
ServiceCollection services = new ServiceCollection();
services.AddTransient<ServiceImpl>();
// 使用using 防止资源泄漏
using (ServiceProvider sp = services.BuildServiceProvider())
{
ServiceImpl t = sp.GetService<ServiceImpl>();
t.Name = "zhangsan";
t.sayHi();
}
Console.Read();
}
public interface IService
{
public string Name { get; set; }
public void sayHi();
}
public class ServiceImpl : IService
{
public string Name { get; set; }
public void sayHi()
{
Console.WriteLine($"你好。我是{Name}");
}
}
}
} ```
运行结果
服务定位器
相关代码
``` using Microsoft.Extensions.DependencyInjection; using System;
namespace ioc1 { class Program { static void Main(string[] args) {
ServiceCollection services = new ServiceCollection();
services.AddScoped<IService, ServiceImpl>();
// 使用using 防止资源泄漏
using (ServiceProvider sp = services.BuildServiceProvider())
{
IService t = sp.GetService<IService>();
t.Name = "lisi";
t.sayHi();
}
Console.Read();
}
public interface IService
{
public string Name { get; set; }
public void sayHi();
}
public class ServiceImpl : IService
{
public string Name { get; set; }
public void sayHi()
{
Console.WriteLine($"你好。我是{Name}");
}
}
}
} ```
运行结果
demo
相关代码
``` using Microsoft.Extensions.DependencyInjection;
namespace di { class Program { static void Main(string[] args) { ServiceCollection services = new ServiceCollection(); services.AddScoped (); services.AddScoped (); services.AddScoped (); services.AddScoped ();
using(var sp = services.BuildServiceProvider())
{
Controller controller = sp.GetRequiredService<Controller>();
controller.Test();
}
Console.ReadKey();
}
}
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("开始上传");
this.storage.Save("内容", "file.txt");
log.Log("上传完毕");
}
}
interface ILog
{
public void Log(string message);
}
class LogImpl : ILog
{
public void Log(string message)
{
Console.WriteLine($"日志为{message}");
}
}
interface IConfig
{
public string GetValue(string name);
}
class ConfigImpl : IConfig
{
public string GetValue(string name)
{
return "hello";
}
}
class DBConfigImpl : IConfig
{
public string GetValue(string name)
{
Console.WriteLine("从数据库读取的配置");
return "from db";
}
}
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("server");
Console.WriteLine($"向服务器{server}的文件名为{name}上传{content}");
}
}
}
```
运行结果
相关优化
修改DependencyInjection类
相关代码
``` using ConfigServices; using LogServices; using MailServices; using Microsoft.Extensions.DependencyInjection;
namespace MailSender { class Program { static void Main(string[] args) { ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddScoped<IConfigService, EnvVarConfigService>();
serviceCollection.AddLayeredConfig();
serviceCollection.AddConsoleLog();
/* serviceCollection.AddScoped(
typeof(IConfigService),
s =>
new IniFileConfigService
{
FilePath = "mail.ini"
});*/
serviceCollection.AddIniFileConfig("mail.ini");
/* serviceCollection.AddScoped<IConfigService, EnvVarConfig>();*/
serviceCollection.AddScoped<IMailService, MailService>();
/* serviceCollection.AddScoped<ILogProvider, ConsoleLogProvider>();*/
using (var sp = serviceCollection.BuildServiceProvider())
{
// 第一个根上的对象只能用ServiceLocator
var mailService = sp.GetRequiredService<IMailService>();
mailService.Send("Hello", "to@123.com", "content");
}
Console.Read();
}
}
} ```
重点代码块
serviceCollection.AddScoped( typeof(IConfigService), s => new IniFileConfigService { FilePath = "mail.ini" });
修改后
serviceCollection.AddIniFileConfig("mail.ini");
在 DependencyInjection 命名空间下,新增了AddIniFileConfig方法,使用时候只需要传入配置文件信息即可
``` using ConfigServices; using MailSender; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace Microsoft.Extensions.DependencyInjection { public static class IniFileConfigExtensions { public static void AddIniFileConfig(this IServiceCollection services,string filePath) { services.AddScoped( typeof(IConfigService), s => new IniFileConfigService { FilePath = filePath }); }
}
}
```