.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 ...
随机推荐
- 分布式计算MapReduce究竟是怎么一回事?
前言 如果要对文件中的内容进行统计,大家觉得怎么做呢?一般的思路都是将不同地方的文件数据读取到内存中,最后集中进行统计.如果数据量少还好,但是面对海量数据.大数据的场景这样真的合适吗?不合适的话,那有 ...
- python操作MySQL数据库连接(pymysql)
目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...
- docker 第一课
centos安装docker yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ...
- RuntimeError: setuptools >= 41 required to build
使用命令python setup.py install 安装第三方库报RuntimeError: setuptools >= 41 required to build 原因setuptools版 ...
- linux挖矿处置
挖矿的类型 主动挖矿:用户在个人电脑或服务器使用挖矿程序进行CPU,GPU计算,获取虚拟货币. 被动挖矿:挖矿病毒通过系统漏洞,恶意程序,弱口令等方式入侵服务器,设备感染挖矿病毒后会开始挖掘虚拟货币. ...
- Python从0到1丨细说图像增强及运算
摘要:本文主要讲解常见的图像锐化和边缘检测方法,即Roberts算子和Prewitt算子. 本文分享自华为云社区<[Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts.Pr ...
- 痞子衡嵌入式:MCUBootUtility v4.0发布,开始支持MCX啦
-- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v3.5.0)发布过去 9 个月了,这一次痞子衡为大家带来了版本升级 v4.0.0,这个版本主要有两个重要更新需要跟大家 ...
- elasticsearch实现简单的脚本排序(script sort)
目录 1.背景 2.分析 3.构建数据 3.1 mapping 3.2 插入数据 4.实现 4.1 根据省升序排序 4.1.1 dsl 4.1.2 运行结果 4.2 湖北省排第一 4.2.1 dsl ...
- JavaScript 中更安全的 URL 读写
前言 URL对于我们开发人员来讲,应该是非常熟悉了.在对URL进行参数拼接时,我们一般都会直接进行字符串拼接或使用模版字符串,因为这样非常方便,但是我们这样其实会在不知不觉中以不安全的方式编写 URL ...
- Unity屏幕永远保持为固定分辨率
Unity屏幕永远保持为固定分辨率 Unity屏幕永远保持为固定分辨率 前言 开题废话 Unity版本 正题: 打开一场景 创建脚本并且编写 挂在脚本到场景摄像机上边 以不同比的分辨率运行程序,并且观 ...