.Net Core中依赖注入服务使用总结

一、依赖注入

  引入依赖注入的目的是为了解耦和。说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用。这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将实现类替换。上面的说的通过接口调用方法,实际上还是需要去实例化接口的实现类,只不过不需要我们手动new 构造实现类,而是交给如微软的DI、Autofac这些工具去构建实现类。我们只需要告诉它们,某个类是某个接口的实现类,当用到的时候,工具会自动通过构造函数实例化类。

二、.Net Core中自带的DI

  本来想写依赖注入源码的讲解的,看到网上有篇文章关于源码讲解的,很详细、清楚,就不再写了。地址:http://www.cnblogs.com/bill-shooting/p/5540665.html。我在这里就说说使用吧。

  依赖注入有三种生命周期,每种生命周期的注入方式大同小异,下面我以作用域生命周期举例,其他两种跟这个不同,我会特别说明。

下面为用到的两个服务。

public class UserService : IUserService
{
public string GetName()
{
return "UserName";
}
}

public interface IUserService
{
string GetName();
}
public class ConfigReader : IConfigReader
{
private string configFilePath;//需要传一个路径,去读取路径下文件的内容
public ConfigReader(string configFileName)
{
this.configFilePath = configFileName;
}
public string Reader()
{
return File.ReadAllText(configFilePath);
}
}

public interface IConfigReader
{
string Reader();
}

 

1、最常用的注入方式,以接口形式暴露服务

services.AddScoped(typeof(IUserService), typeof(UserService));

services.AddScoped
<IUserService, UserService>();

两种注入方式是一个意思,这种方式适合实现类为无参构造函数或者有参构造函数中参数已经被注入过了。

   2、自己注入自己,以实现形式暴露服务

services.AddScoped<UserService>();


services.AddScoped(typeof(UserService));

这种注入方式适合只有实现类,没有借口类的注册。

  3、需要传参的构造函数的类的注入

services.AddScoped<IConfigReader, ConfigReader>(x => { return new ConfigReader("c:/a.txt"); });
services.AddScoped
<IConfigReader>(x => { return new ConfigReader("c:/a.txt"); });

services.AddScoped(
typeof(IConfigReader), x => { return new ConfigReader("c:/a.txt"); });

前两个匿名方法参数是IServiceProvider,返回值为一个实例,第三个返回值是Object。上面举的例子没有用到IServiceProvider ,下面再举一个例子。修改上面的UserService类,将构造方法需要一个IConfigReader参数。

public class UserService : IUserService
{
private IConfigReader configReader;

public UserService(IConfigReader configReader)
{
this.configReader = configReader;
}
public string GetName()
{
return "UserName" + configReader.Reader();
}
}

注册的时候,如下:

services.AddScoped<IConfigReader, ConfigReader>(x => { return new ConfigReader("c:/a.txt"); });
//通过ServiceProvider获取已经注册的IConfigReader
services.AddScoped
<IUserService, UserService>(x => { return new UserService(x.GetService<IConfigReader>()); });
//或者
services.AddScoped<IUserService, UserService>(x => { return new UserService(new ConfigReader("c:/a.txt")); });

 单例类型的生命周期多了两种注入方式:

services.AddSingleton<IConfigReader>(new ConfigReader("c:/a.txt"));

services.AddSingleton(typeof(IConfigReader), new ConfigReader("C:/a.txt"));

自带的依赖注入工具也可以批量注入

var assembly = Assembly.GetExecutingAssembly()
.DefinedTypes
.Where(a
=> a.Name.EndsWith("Service") && !a.Name.StartsWith("I"));

foreach (var item in assembly)
{
services.AddTransient(item.GetInterfaces().FirstOrDefault(), item);
}

 注意:当一个服务有多个实现时,调用的时候通过 IEnumerable<IPayService> PayServices 获取所有的实现服务。

services.AddTransient<IPayService, AliPayService>();
services.AddTransient
<IPayService, WeChatPayService>();

使用的时候:

640?wx_fmt=png

三、Autofac

  1、以接口形式暴露服务

public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

var builder = new ContainerBuilder();
builder.Populate(services);

builder.RegisterType
<UserService>().As<IUserService>().InstancePerLifetimeScope();

var container = builder.Build();
return new AutofacServiceProvider(container);
}

  2、通过实现类暴露服务

builder.RegisterType<UserService>();

  3、需要传参的构造函数的类的注入

 builder.Register(c => new ConfigReader("c:/a.txt")).As<IConfigReader>();

  4、通过程序集注入

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(c
=> c.Name.EndsWith("Service"))
.AsImplementedInterfaces();

总结:

不论是微软的依赖注入组件还是Autofac 原理都是先将接口和对应的实现类注入到容器中,当要使用的时候,组件会自动通过构造函数创建实例。这里有个问题如果有个实现类有多个构造函数,组件会找满足参数最多的那个构造函数。

原文地址:https://www.cnblogs.com/MicroHeart/p/10861366.html

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


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

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

相关文章

ADPC2-D 分配颜色

ADPC2-D 分配颜色 题意&#xff1a; n*m的表格&#xff0c;一开始都是红色的&#xff0c;现在可以进行p次操作1和q次操作2 操作1&#xff1a; 把某一行的同学进行取反操作&#xff1a;即红色变为蓝色&#xff0c;蓝色变成红色。 操作2&#xff1a; 把某一列的同学进行取反操作…

[BZOJ3944] Sum

[BZOJ3944] Sum 题目描述&#xff1a; solution 裸的杜教筛。 唯一的坑点在于卡常。 似乎ans1和ans2都杜教筛超时了。 然而用杜教筛求出ans2&#xff0c;并用求出ans1不超时&#xff1f;&#xff01;&#xff1f;。 ​ ​ ​ #include<bits/stdc.h> using namespac…

SuperSocket 2.0 Preview1 发布,.NET Socket服务器框架

今天&#xff0c;SuperSocket的作者发布了2.0版本的第一个预览版。SuperSocket 2.0 是一个经过全新设计的&#xff0c;第一个完全基于.NET Core的版本。作者正在积极尝试提供更简单易用的API的同时&#xff0c;尽量保证与老版本相似的原汁原味的开发体验。新的版本中亦删除了一…

Codeforces Round #735 (Div. 2)

Codeforces Round #735 (Div. 2) 题海题目知识点ACherryBCobbCMikasaDDianeEYou

[LG P2519][BZOJ2298][HAOI2011]problem a

[LG P2519][BZOJ2298][HAOI2011]problem a 题目描述 一次考试共有n个人参加 第i个人说&#xff1a;"有ai个人分数比我高&#xff0c;bi个人分数比我低。" 问最少有几个人没有说真话(可能有相同的分数) 输入输出格式 输入格式&#xff1a; 第一行一个整数n&…

跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇

fireasy 面世都有六个年头了&#xff0c;至今依旧是默默无闻&#xff0c;知道它的人可能仅限于本人朋友圈内的人士。本人也在写一本关于如何使用该框架的书籍&#xff0c;但苦于事务繁忙&#xff0c;至今也才写了一半&#xff0c;可以说最为实用最为核心的部分&#xff0c;仍然…

hdu4609 3-idiots

hdu4609 3-idiots 题意&#xff1a; 给出n个木棍以及它们的长度&#xff0c;求取其中三根长度各不相同的木棍组成三角形的概率 题解&#xff1a; 三角形满足条件&#xff1a; 任意两边之和大于第三边 我们设多项式A(x&#xff09;&#xff0c;其中Cixi(Ci是系数)C_ix^i(C_i…

某谷 P1654 OSU!

某谷 P1654 OSU! 题目背景 原 《产品排序》 参见P2577 题目描述 osu 是一款群众喜闻乐见的休闲软件。 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作&#xff0c;每次操作只有成功与失败之分&#xff0c;成功对应1&#xff0c;失败对应0&#xff0c;n次操作…

dotnet pack 打包文件版本号引起 Could not load file or assembly 问题

如果不是遇到&#xff0c;真的不会想到&#xff0c;代码世界的问题真是千奇百怪&#xff0c;这次遇到的是 dotnet pack 打包文件版本号引起的问题。之前进行 nuget 打包都是在 Visual Studio build 时进行&#xff0c;版本号时通过 .csproj 中的 VersionPrefix 指定&#xff0c…

FFT/NTT/FMT/FWT题目

快速傅里叶变换FFT hdu4609 3-idiots P4173 残缺的字符串 Hash Function [AH2017/HNOI2017]礼物 CF993E Nikita and Order Statistics 快速沃尔什变换 FWT BZOJ4589. Hard Nim Tree Cutting HDU - 5909 快速莫比乌斯变换 FMT 快速数论变换 NTT P2000 拯救世界

[Wannafly挑战赛2D-Delete]最短路

[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点&#xff0c;m 条边的带权有向无环图&#xff0c;同时给定起点 S 和终点 T &#xff0c;一共有 q 个询问&#xff0c;每次询问删掉某个点和所有与它相连的边之后 S 到 T 的最短路&#xff0c;询问之间互相独立(即删…

ASP.NET Core MVC 视图

ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处&#xff0c;学习难度较低。以下内容主要体现了编程中模块化的思想&#xff0c;模块化才应是我们关注的重点。布局用于提供各个页面所需的公共部分&#xff0c;如&#xff1a;菜单、页头、页尾等。在ASP.NET Core中默认…

CF993E Nikita and Order Statistics

CF993E Nikita and Order Statistics 题意&#xff1a; 给你一个数组 a1∼na_{1 \sim n}a1∼n​&#xff0c;对于 k0∼nk 0 \sim nk0∼n&#xff0c;求出有多少个数组上的区间满足&#xff1a;区间内恰好有 k 个数比 x 小。 x 为一个给定的数。 n≤2105n \le 2 \times 10^5n…

ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

之前开发前端的时候&#xff0c;webpack 会有热更新工具&#xff0c;在修改了代码之后&#xff0c;自动将代码编译&#xff0c;实时展现到页面上&#xff0c;给开发带来了极大的方便。Java也可以通过第三方插件JRebel实现热部署&#xff0c;不用频繁的重启Tomcat。微软官方也为…

P3825 [NOI2017]游戏

P3825 [NOI2017]游戏 题目描述 小 L 计划进行n场游戏&#xff0c;每场游戏使用一张地图&#xff0c;小 L 会选择一辆车在该地图上完成游戏。 小 L 的赛车有三辆&#xff0c;分别用大写字母A、B、C表示。地图一共有四种&#xff0c;分别用小写字母x、a、b、c表示。其中&#x…

事关SuperSocket发布,寻找YangFan哥哥

SuperSocket近日发布了2.0的第一个预览版《SuperSocket 2.0 Preview1 发布&#xff0c;.NET Socket服务器框架》&#xff0c;在NuGet上以一个包含数个SuperSocket程序集的大包的形式发布。https://www.nuget.org/packages/SuperSocket/2.0.0-preview1我原意以独立小包的形式发布…

P3321 [SDOI2015]序列统计(未解决)

P3321 [SDOI2015]序列统计 题意&#xff1a; 题解&#xff1a; 参考题解&#xff1a; 题解 P3321 【[SDOI2015]序列统计】 【LG3321】[SDOI2015]序列统计 神仙题。。学透再补 代码&#xff1a;

P1963 [NOI2009]变换序列

题目描述 不想水字&#xff0c;详见某谷&#xff1a;P1963 [NOI2009]变换序列 solution 其实 的计算就类似于环上的距离。 对于每一个 都可能有两种位置选择&#xff1a;&#xff0c; 。 所以把它们分别连边&#xff0c;二分图上匈牙利算法求完美匹配即可。 #include&…

一次 .NET Core 中玩锁的经历:ManualResetEventSlim, SemaphoreSlim

最近同事对 .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试&#xff0c;发现在 linux 上高并发下使用 async 异步方法读取缓存数据会出现大量失败的情况&#xff0c;比如在一次测试中&#xff0c;100万次读取缓存&#xff0c;只有12次成功&…

BZOJ4589. Hard Nim

BZOJ4589. Hard Nim 题意&#xff1a; Claris和NanoApe在玩石子游戏&#xff0c;他们有n堆石子&#xff0c;规则如下&#xff1a; Claris和NanoApe两个人轮流拿石子&#xff0c;Claris先拿。每次只能从一堆中取若干个&#xff0c;可将一堆全取走&#xff0c;但不可不取&…