综合案例1
需求说明
1、目的:演示DI的能力;
 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。
 3、说明:案例中开发了自己的日志、配置等接口,这只是在揭示原理,.NET有现成的,后面讲。
实现1
1、创建三个.NETCore类库项目,ConfigServices是配置服务的项目,LogServices是日志服务的项目,Mailservices是邮件发送器的项目,然后再建一个.NETCore控制台项目MailServicesConsole来调用MailServices。MailServices项目引用ConfigServices项目和LogServices项目,而MailServicesConsole项目引用MailServices项目。
 2、编写类库项目LogServices,创建ILogProvider接口。编写实现类ConsoleLogProvider。编写一个ConsoleLogProviderExtensions定义扩展方法AddConsoleLog,namespace和IServiceCollection一致
实现2
1、编写配置服务的类库项目ConfigServices。接口IConfigProvider,方法:stringGetValue(string name).2、环境变量读取配置类EnvVarConfigProvider:Environment.GetEnvironmentVariable(name);编写一个类带扩展方法:AddEnvVarConfig3、编写从ini文件中读取配置的类ConfigServices。
新建控制台项目
 
 新建类库项目
 
 日志服务
 logServices 接口
 
实现类
 
 配置服务
 
 添加实现类
 
邮件服务
需要添加日志引用
 
控制台项目添加 邮件服务得引用
 
添加IMailServices 接口
 
Nuget 导入包 ,引入命名空间
 
控制台测试
 
运行结果:
 
综合案例2
新建配置实现类:
 
新建配置文件
 
 
 
 编写实现类 代码(读取ini 文件)
 
 主类:
 
运行结果:
 
方式二 更简单的方法
希望提供一个add 方法
 
 使用扩展方法
 添加一个扩展方法
 
使用:
 
 运行结果:
 
 改写ini配置文件读取:
 
 调用
 
 运行结果:
 
综合案例3
实现3
1、“可覆盖的配置读取器”。配置中心服务器。可以本地的覆盖配置服务器的,或者配置文件覆盖环境变量的。例如,按照“配置中心服务器”、“本地环境变量”、“本地配置文件”的顺序添加了三个配置提供者,在“配置中心服务器”中提供了“a=1;b=2;c=3”这三个配置项,在“本地环境变量”中配置了“a=10;b=20;”,在“本地配置文件”中配置了“b=200”,那么最终我们读取的时候读到的就是’a=10;b=200;c=3;’
 2、定义一个从各个ConfigProvider中读取项的IConfigReader接口。编写实现类LayeredconfigReader。
示例:
 
 实现类:

 
 扩展方法:
 
 更改MailService
 
 调用
 
 运行结果:
 
 添加环境变量
 
运行结果:
 
 改变后运行
 
 运行结果
 
总结
关注于接口,而不是关注于实现,各个服务可以更弱耦合的协同工作。在编写代码的时候,我们甚至都不知道具体的服务是什么。
 第三方DI容器:Autofac等。Autofac优点:支持属性注入基于名字注入、基于约定的注入等。



















