如何在.NET Core控制台程序中使用依赖注入

背景介绍

依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度。在.NET Core MVC中
我们可以在Startup.cs文件的ConfigureService方法中使用服务容器IServiceCollection注册接口及其实现类的映射。

例如,当我们需要访问Http上下文时,我们需要配置IHttpContextAccessor接口及其实现类HttpContextAccessor

640?wx_fmt=png

那么当我们编写一个.NET Core控制台程序的时候,我们该如何使用依赖注入呢?

使用内置依赖注入

在.NET Core中,内置依赖注入模块使用的程序集是Microsoft.Extensions.DependencyInjection

所以如果希望在控制台程序中使用内置依赖注入,我们首先需要使用NUGET添加对Microsoft.Extensions.DependencyInjection程序集的引用。

PM> Install-Package Microsoft.Extensions.DependencyInjection

这里为了说明如何使用.NET Core内置的依赖注入模块, 我们创建以下2个服务接口。

640?wx_fmt=png

然后我们针对这2个服务接口,添加2个对应的实现类

640?wx_fmt=png

代码解释

  • BarService类构造函数依赖了一个IFooService接口的实现

  • FooService类构造函数依赖一个ILoggerFactory接口的实现

  • FooService中,我们输出了一个Information级别的日志

在以上实现类代码中,我们使用了.NET Core内置的日志模块, 所以我们还需要使用NUGET添加对应的程序集Microsoft.Extensions.Logging.Console

PM> Install-Package Microsoft.Extensions.Logging.Console

最后我们来修改Program.cs, 代码如下

640?wx_fmt=png

代码解释

  • 这里我们手动实例化了一个ServiceCollection类, 这个类是IServiceCollection>接口的一个实现类,它就是一个.NET Core内置服务容器。

  • 然后我们在服务容器中注册了IFooService接口的实现类FooService以及IBarService接口的实现类BarService

  • 当时需要从服务容器中获取接口类的对应实现类时,我们只需要调用服务容器类的GetSerivce方法。

最终效果

运行程序,我们期望的日志,正确的输出了

640?wx_fmt=png

使用第三方依赖注入

除了使用内置的依赖注入模块,我们还可以直接使用一些第三方的依赖注入框架,例如Autofac, StructureMap。

这里我们来使用StructureMap来替换当前的内置的依赖注入框架。

首先我们需要先添加程序集引用。

PM> Install-Package StructureMap.Microsoft.DependencyInjection

然后我们来修改Program.cs文件,代码如下

640?wx_fmt=png

代码解释

  • 这里我们实例化了一个StructureMap的服务容器Container, 并在其Configure方法中配置了接口类及其实现类的自动搜索。这里使用的是一种约定,接口类必须以字母“I”开头, 实现类的名字和接口类只相差一个字母“I”, 例IFooServiceFooServiceIBarServiceBarService

  • 后续代码和前一个例子基本一样。虽然看起来代码多了很多,但是实际上这种使用约定的注入方式非常强力,可以省去很多手动配置的代码。

最终效果

运行程序,代码和之前的效果一样

640?wx_fmt=png

原文地址: https://www.cnblogs.com/lwqlun/p/9736391.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #668 (Div. 2)

前20分钟做题&#xff0c;后面看题&#xff0c;二题战士&#xff0c;赛后补题www A - Permutation Forgery 直接逆序输出即可 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> …

CF438E-The Child and Binary Tree【生成函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF438E 题目大意 每个节点有nnn个权值可以选择&#xff0c;对于1∼m1\sim m1∼m中的每个数字kkk&#xff0c;求权值和为kkk的二叉树个数。 解题思路 设fnf_nfn​表示权值和为nnn的方案数&#xff0c;gng_ngn​表示nnn这个权…

纪中A组模拟赛总结(2021.7.13)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3121212lyflyflyf150150150100100100303030202020总结 比赛的时候TJH直接怒言&#xff1a;T1不是网络流吗&#xff01;&#xff01;&#xff01;然后想了想网络流&#xff0c;发现可以用费用流&#xff0c;但只…

牛客网 【每日一题】7月24日题目精讲—小A的柱状图

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;小A的柱状图时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 柱状图是有一些宽度相等的矩形下端对齐以后…

在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制...

Swashbuckle.AspNetCore3.0 介绍一个使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由&#xff0c;控制器和模型生成漂亮的 API 文档&#xff0c;包括用于探索和测试操作的 UI。项目主页&#xff1a;https://github.com/domaindrivendev/Swashbuckle.AspNetCore划…

Codeforces Round #669 (Div. 2)

那天晚上和同学打球打的有点晚&#xff0c;结果就鸽了&#xff0c;现在来补一下 A - Ahahahahahahahaha 直接看原数组中0的个数cnt0和1的个数cnt1&#xff0c;谁多留谁即可&#xff0c;注意留1的时候要留偶数个。 #define IO ios::sync_with_stdio(false);cin.tie();cout.ti…

P3235-[HNOI2014]江南乐【整除分块,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/P3235 题目大意 TTT组游戏&#xff0c;固定给出FFF。每组游戏有nnn个石头&#xff0c;每次操作的人可以选择一个数量不少于FFF的石堆并把它尽量均摊成MMM堆(M>1)(M>1)(M>1)。无法操作的人输&#xff0c;求每组游戏是…

【线段树】二进制(luogu 4428)

正题 luogu 4428 题目大意 给你一个01串&#xff0c;让你进行一下两种操作&#xff1a; 1.将其中一位取反 2.问你某一段中有多少个子串满足有一种排列方案&#xff0c;使得组成的二进制数是3的倍数 解题思路 不难发现&#xff0c;因为2%32&#xff0c;所以2的幂%3的结果按12…

牛客网【每日一题】7月29日题目精讲—Max Power

来源&#xff1a;牛客网&#xff1a; Max Power 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小卤蛋刚把dnf的技能点重新洗了一遍,现在他要重新加点,假设他的技能树一共有…

Swashbuckle.AspNetCore3.0的二次封装与使用

关于 Swashbuckle.AspNetCore3.0一个使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由&#xff0c;控制器和模型生成漂亮的 API 文档&#xff0c;包括用于探索和测试操作的 UI。项目主页&#xff1a;https://github.com/domaindrivendev/Swashbuckle.AspNetCore项…

牛客练习赛 69

第一次打牛客直接。。。 y1s1牛客的评测系统真的慢&#xff0c;搞得我不想交 B - 划分 题目链接 首先先对数组a[]逆序贪心可得val(i,j)a1a2⋯aijval(i,j)a_1a_2\dotsa_{ij}val(i,j)a1​a2​⋯aij​ 尝试证明&#xff1a;分析可知我们最终会选择ijijij个数组a[]的数&#xff0…

P3645-[APIO2015]雅加达的摩天楼【bfs,根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/P3645 题目大意 nnn个点&#xff0c;mmm条狗&#xff0c;第iii条狗可以往左或者右跳恰好pip_ipi​步&#xff0c;开始是000号狗&#xff0c;每次跳跃到达一个点可以选择换一条狗&#xff0c;求到111号狗所在点的最短路。 解题…

纪中A组模拟赛总结(2021.7.14)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3393939lyflyflyf232323181818555000总结 比赛的时候T1是另一道题&#xff0c;就是一道二分DP&#xff0c;推了一会就写出来了 然后就在推T2&#xff0c;推了好久只推了一点 考到一半的时候XC过来说T1改题了&…

.NET微服务调查结果

.NET Core就是专门针对模块化的微服务架构而设计, 在2018年国庆时间展开.NET微服务的使用情况&#xff0c;本次调查我们总计收到了来自378个开发者的调查。从落地现状、架构体系、未来趋势等方面对微服务进行了分析。希望能够为传统企业微服务决策、规划和实施提供依据和解决办…

牛客网【每日一题】7月30日题目精讲—Xor Path

来源&#xff1a;牛客网&#xff1a; Xor Path 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给定一棵n个点的树&#xff0c;每个点有权值A i。定义path(i,j)表示i 到j 的…

Codeforces Round #670 (Div. 2)

A - Subset Mex 知道NIM游戏应该都知道Mex。那就直接贪心分组&#xff0c;保证尽可能每组都存在每一个自然数&#xff0c;然后按照Mex定义直接求答案即可 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #…

纪中A组模拟赛总结(2021.7.15)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4212121lyflyflyf113113113000333333303030505050 总结 T1开始想到可以暴力枚举质因数&#xff0c;然后可以跑一个线性同于方程&#xff0c;然而我完全不会扩欧&#xff0c;就乱打了一个费马小&#xff0…

P3703-[SDOI2017]树点涂色【LCT,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P3703 题目大意 nnn个点的一棵树开始所有点有不同的颜色&#xff0c;mmm次操作 将根节点到xxx节点的路径上染上一种新的颜色询问一条路径的不同颜色个数询问一个节点的子树中的一个xxx使得xxx到根节点的颜色最多。 解题思路 …

牛客练习赛 68

A.牛牛的mex n,q≤105,0≤ai<n且ai互不相同n,q≤10 ^5,0≤a i<n 且 a_i互不相同n,q≤105,0≤ai<n且ai​互不相同 后面两个条件非常重要&#xff0c;通过后面两个条件将问题转化为一个区间内最小未出现的自然数就等于不在这个区间内最小出现的自然数对于区间[l,r][l,r]…

牛客网【每日一题】7月31日题目精讲—兔子的区间密码

来源&#xff1a;牛客网 &#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 有一只可爱的兔子被困在了密室了&a…