1、简介

  DI:Dependency Injection,即依赖注入,他是IOC的具体实现。

  在DI中,底层服务对象不再负责依赖关系的创建,而是交由顶端调用进行管理注入

  好处:降低组件之间的耦合度,使代码更加灵活

2、实例

  我们举个例子,有个User Login的功能,Login需要通过DB验证,DB需要读取Config和进行Log记录

  依赖关系如图

  

  DI的概念,就是把DB的依赖(Config&Log)提到User层,该怎么实现呢?

  接着往下走...

3、代码结构

  通过代码我们来看一下原理。

  框架说明:

    1)Service类库:Standard2.1,类库推荐都使用Standard,这样可以在Framework、core、net之间通用

    2)UserSite:Net5 控制台程序

  

  编码内容:

  ConfigService,包含两种实现方式

namespace ConfigService
{
public interface IConfig
{
public string GetValue(string key);//获取name的值
}
} using System;
namespace ConfigService
{
public class EnvironmentConfig : IConfig //从环境变量里面读取配置信息,自行添加到电脑User里面
{
public string GetValue(string key)
{
return Environment.GetEnvironmentVariable(key, EnvironmentVariableTarget.User);
}
}
} using System.IO;
using System.Linq;
namespace ConfigService
{
public class IniFileConfig : IConfig //从ini文件读取配置信息,UserSite如果注入此服务,需要创建ini文件
{
string _filePath;
public IniFileConfig(string filePath)
{
this._filePath = filePath;
}
public string GetValue(string key)
{
string str = "";
var kv = File.ReadAllLines(_filePath)
.Select(x => x.Split("="))
.Select(x => new { key = x[0], value = x[1] })
.SingleOrDefault(x => x.key == key);
return kv?.value;
}
}
}

  LogService,简单实现

namespace LogService
{
public interface ILog
{
public void LogInfo(string msg);
public void LogError(string msg);
}
} using System;
namespace LogService
{
public class ConsoleLog : ILog
{
public void LogInfo(string msg)
{
Console.WriteLine($"Info:{msg}");
}
public void LogError(string msg)
{
Console.WriteLine($"Error:{msg}");
}
}
}

  DBService,只是做思路演示,这边只要读取到dblink就算访问数据库成功

namespace DBService
{
public interface IDBHelper
{
public bool CheckUser(string acc, string pwd);
}
} using LogService;
using ConfigService;
namespace DBService
{
public class SqlServerHelper : IDBHelper
{
private IConfig _config;
private ILog _log;
public SqlServerHelper(IConfig config,ILog log) //Net默认从构造函数进行以来注入
{
this._config = config;
this._log = log;
}
public bool CheckUser(string acc, string pwd)
{
var dblink = this._config.GetValue("dblink");
this._log.LogInfo($"获取数据库链接={dblink}");
if (string.IsNullOrWhiteSpace(dblink))
{
this._log.LogError($"登录失败");
return false;
}
this._log.LogInfo($"登录成功-{acc}-{pwd}");
return true;
}
}
}

  主题来了,UserSite Program代码如下:

  我们需要注入SqlServerHelper服务,就需要将其依赖项一同注入,这样就将具体实现类提到了顶端注入,从而进行解耦

  比如:读取配置文件,我希望从哪读取,就注入哪一个(注意,都注入的话,IConfig会以后注入的为准)

using System;
using ConfigService;
using LogService;
using DBService;
using Microsoft.Extensions.DependencyInjection; namespace UserSite
{
class Program
{
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<ILog, ConsoleLog>();
services.AddScoped<IConfig, EnvironmentConfig>(); //1、我希望从环境变量读取配置
services.AddScoped(typeof(IConfig), x => new IniFileConfig("db.ini")); //2、我希望从ini读取配置
services.AddScoped<IDBHelper, SqlServerHelper>();
using (var sp = services.BuildServiceProvider())
{
var service = sp.GetRequiredService<IDBHelper>();
service.CheckUser("kxy", "123");
};
Console.ReadLine();
}
}
}

  DI的简单原理就是这样。。

  

.Net DI(Dependency Injection)依赖注入机制的更多相关文章

  1. spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  2. Spring框架xml配置文件 复杂类型属性注入——数组 list map properties DI dependency injection 依赖注入——属性值的注入依赖于建立的对象(堆空间)

    Person类中的各种属性写法如下: package com.swift.person; import java.util.Arrays; import java.util.List; import ...

  3. Spring4 -03 -Dependency Injection (依赖注入) : 代码体现/配置xml/测试

    DI:中文名称:依赖注入 英文名称((Dependency Injection) DI 是什么? 3.1 DI 和IoC 是一样的,差不多一样的技术和模板! 3.2 当一个类(A)中需要依赖另一个类( ...

  4. asp.net core 系列之Dependency injection(依赖注入)

    这篇文章主要讲解asp.net core 依赖注入的一些内容. ASP.NET Core支持依赖注入.这是一种在类和其依赖之间实现控制反转的一种技术(IOC). 一.依赖注入概述 1.原始的代码 依赖 ...

  5. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

  6. 基于注解的DI(DI:Dependency Injection 依赖注入)

    注解方式xml里面就不需要注册bean了. 构建注解需要 1.导入spring-aop-4.2.1.RELEASE.jar 包  2.需要更换配置文件头,即添加相应的约束. 现在的Student类就要 ...

  7. 理解依赖注入(DI - Dependency Injection)

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  8. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  9. 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]

    原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...

  10. ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

    在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...

随机推荐

  1. MongoDB海量数据分页查询优化

    MongoDB海量数据分页查询优化 一.背景 大量数据需从Mongo拿出来,一次性拿出来不科学,传统分页效率低下 二.传统方案 就是最常规的方案,假设 我们需要对文章 articles 这个表(集合) ...

  2. 天坑,这样一个lambda随机取数据也有Bug

    前几天,一位网友跟我说他编写的一段很简单的代码遇到了奇怪的Bug,他要达到的效果是从一个List中随机取出来一条数据,代码如下: 1 var random = new Random(); 2 var ...

  3. 【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系

    NIO与内存映射文件 Java类库中的NIO包相对于IO包来说有一个新功能就是 [内存映射文件],在业务层面的日常开发过程中并不是经常会使用,但是一旦在处理大文件时是比较理想的提高效率的手段,之前已经 ...

  4. Python报SyntaxError: Missing parentheses in call to ‘print’. Did you mean print()

    SyntaxError: Missing parentheses in call to 'print'. Did you mean print()原因:python2.X版本与python3.X版本输 ...

  5. 1、mybatis逆向工程

    mybatis逆向工程可以针对单表自动生成mybatis执行所需要的mapper.java.mapper.xml代码(dao层),可以让程序员将更多的精力放在繁杂的业务逻辑上(service层与con ...

  6. 在IQuery中使用除法提示"Numeric value does not fit in a System.Decimal"

    起因 有个需求是需要汇总(单耗=单件用量*1+损耗率)的值,由于现在我们数据库中存的XX率都是放大了一百倍(即10%数据库存的是10),然后就很自然的写了个linq汇总如下 materialOrder ...

  7. [深度学习] ubuntu18.04配置深度学习环境笔记

    最近装过很多ubuntu18.04系统的nvidia驱动,cuda10.2,cudnn7.6.5,发现每次都会出现一些小问题.总结了具体步骤,做个记录.主要分为三个步骤:驱动安装,cuda安装,cud ...

  8. python进阶之路12之有参装饰器、多层语法糖、递归函数简介

    多层语法糖 def outter1(func1): print('加载了outter1') def wrapper1(*args, **kwargs): print('执行了wrapper1') re ...

  9. P8474 「GLR-R3」立春

    简要题意 \(\tau(\sigma)\) 表示排列 \(\sigma\) 的逆序对个数,求: \[\sum_{i \in \operatorname{permutation(n)}}2^{\tau( ...

  10. angular---angular路由守卫,有的可以访问有的不可以访问,有的路由地址只有在满足条件时候访问,其它禁止访问,