.Net DI(Dependency Injection)依赖注入机制
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)依赖注入机制的更多相关文章
- spring in action学习笔记一:DI(Dependency Injection)依赖注入之CI(Constructor Injection)构造器注入
一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...
- Spring框架xml配置文件 复杂类型属性注入——数组 list map properties DI dependency injection 依赖注入——属性值的注入依赖于建立的对象(堆空间)
Person类中的各种属性写法如下: package com.swift.person; import java.util.Arrays; import java.util.List; import ...
- Spring4 -03 -Dependency Injection (依赖注入) : 代码体现/配置xml/测试
DI:中文名称:依赖注入 英文名称((Dependency Injection) DI 是什么? 3.1 DI 和IoC 是一样的,差不多一样的技术和模板! 3.2 当一个类(A)中需要依赖另一个类( ...
- asp.net core 系列之Dependency injection(依赖注入)
这篇文章主要讲解asp.net core 依赖注入的一些内容. ASP.NET Core支持依赖注入.这是一种在类和其依赖之间实现控制反转的一种技术(IOC). 一.依赖注入概述 1.原始的代码 依赖 ...
- Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转
小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...
- 基于注解的DI(DI:Dependency Injection 依赖注入)
注解方式xml里面就不需要注册bean了. 构建注解需要 1.导入spring-aop-4.2.1.RELEASE.jar 包 2.需要更换配置文件头,即添加相应的约束. 现在的Student类就要 ...
- 理解依赖注入(DI - Dependency Injection)
系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...
- ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)
在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...
- 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]
原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...
- ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)
在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...
随机推荐
- 出现报错:The field admin.LogEntry.user was declared with a lazy reference to 'api.user', but app 'api' isn't installed.解决方法
- C#关于委托的一些事,开发日志
----- 委托是什么------ 其实委托事件很好理解,就当成是c语言中的函数指针或者是回调函数,或者说换种理解方式,信号和槽?触发器和接收器?总之就是一个地方调用了这个函数,那么在另一个地方也会调 ...
- Django框架:8、聚合查询、分组查询、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数
Django 数据库 目录 Django 数据库 一.聚合查询 二.分组查询 三.F查询与Q查询 1.F查询 2.Q查询 3.Q查询进阶操作 四.ORM查询优化 1.only与defer 五.ORM事 ...
- uniapp 微信小程序自己封装头部标题栏
一.首先要关闭原生导航栏 :在pages.json 中设置 "navigationStyle":"custom" 二.在APP.vue中 onLaunch: ...
- [python] python-pinyin库
python-pinyin库是一个汉字拼音转换工具,其主要功能有: 根据词组智能匹配最正确的拼音. 支持多音字. 简单的繁体支持, 注音支持. 支持多种不同拼音风格. 安装命令为:pip instal ...
- MongoDB分片副本集生产环境部署-Windows版本
title: MongoDB分片副本集生产环境部署(Windows版本) date: 2022-10-29 17:21:11 tags: - 运维 系统架构 配置环境 系统都是windows 10 专 ...
- P8701 [蓝桥杯 2019 国 B] 第八大奇迹
简要题意 你需要维护一个长度为 \(L\) 的序列 \(a\),初始时全部都是 \(0\),有 \(N\) 个操作,支持: C p x,将 \(a_p\) 修改为 \(x\). Q a b,输出 \( ...
- 从log4j切换到logback后项目无法启动
1.背景 有个旧项目之前使用的是log4j2来打印日志的,因为某些原因,同事想换成logback. 换成logback改动也很简单,大致就一下2步: 删除log4j2.xml配置,新增logback. ...
- 计组Review1
1GB的内存,它是以字节编址的,假设内存地址为32位,128KB的高速缓存.现在有一个数据位于0x123456(字节编址),会映射到那些不同情形的内存单元上,还有TAG和总缓存大小. 1. 直接映射, ...
- 基于WebSocket的实时消息传递设计
目录 概述 整体架构 设计 流程设计 程序设计 WebSocketServer 概述 新增pom 新增配置类 创建websocket端点 WebSocketClient 概述 安装WebSocketS ...