之前学Java的时候,Spring框架的两大核心IOC和AOP带给我比较深刻的印象,尤其是IOC的设计思想,当我看到使用Spring框架使代码变得很简洁而优雅的时候,当我不需要在时时刻刻自己来创建对象的时候,就感觉好舒服
前言
现在学习.NET Core,发现也有IOC的设计思想,依赖注入是IOC的一种重要实现方式,而.NET Core程序的各个部分是通过依赖注入功能组装在一起的,可以说IOC思想指导了.NET Core的整体框架的实现,.NET Core有以下三个重要的核心基础组件:依赖注入,配置系统,日志
一,依赖注入
众所周知,IOC思想的重要实现方式就是依赖注入,依赖注入简化了模块的组装过程,减小了模块见得耦合度
在传统的软件开发中,代码依赖的对象都是由调用者自己编写代码进行创建和组装的,这样做的最大缺点在于开发人员需要清楚每个类的作用,以及如何构建和组装它们,代码的耦合度很高。
以前传统读取配置的方式
var connStr = ConfigurationManager.ConnectionStrings("connStr1") ConnectionString;
SqlConnection conn = new SqlConnection(connStr)
conn.StatisticsEnabled = true;
经过IOC思想设计改造的
- 服务定位器
- 依赖注入
服务定位器
IDbConnection conn = ServiceLocator.GetService<IDbConnection>();
依赖注入
class Demo
{
public IDbConnection Conn {get; set}
public void InsertDB()
{
IDbCommand cmd = Conn.CreateCommand();
}
}
二,.NET Core依赖注入的基本使用
.NET Core中内置了控制反转机制,它同时支持了依赖注入和服务定位器两种方式,依赖注入是比较推荐的方式,依赖注入框架中注册的服务有一个重要的概念叫做生命周期,一共有三种
- 瞬态
- 每次请求的时候都会创建一个新的对象
- 范围
- 在给定范围内,多次请求同一个服务对象,服务每次被请求的时候都会返回同一个对象,在不同过的范围内,服务每次请求的时候会返回不同过的对象
- 单例
- 全局共享同一个服务对象
练习代码
public interface ITestService
{
public string Name { get; set; }
public void SayHi();
}
using Microsoft.Extensions.DependencyInjection;
//普通注册方式
/*
ServiceCollection services = new ServiceCollection();
services.AddTransient<TestServiceImpl>();
using (ServiceProvider sp = services.BuildServiceProvider())
{
TestServiceImpl testService = sp.GetRequiredService<TestServiceImpl>();
testService.Name = "tom";
testService.SayHi();
}*/
ServiceCollection services = new ServiceCollection();
services.AddTransient<TestServiceImpl>();
using (ServiceProvider sp = services.BuildServiceProvider())
{
var ts1 = sp.GetRequiredService<TestServiceImpl>();
var ts2 = sp.GetRequiredService<TestServiceImpl>();
Console.WriteLine(object.ReferenceEquals(ts1, ts2));
}
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}");
}
}