.NET Core第二天核心基础组件之依赖注入

之前学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}");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栀梦星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值