ASP.NET Core使用编译时依赖关系注入(DI)

前言

依赖关系注入(DI),是一种在类及其依赖项之间实现控制反转(IoC)的技术。在ASP.NET Core中,依赖关系注入是“一等公民”,被大量使用。

通常,使用接口作为依赖关系实现抽象化,并且在服务容器中注册依赖关系,最后在运行时由框架负责创建依赖关系的实例,注入到使用它的类的构造函数中。

但是,如果忘记在服务容器中注册依赖关系,例如下面的代码,IRepository是WeatherForecastController的依赖项,但是没有被注册:

private readonly IRepository repository;public WeatherForecastController(IRepository repository)
{ this.repository = repository;
}

代码可以正常编译,但是在运行时会报错:

8ca928669ea4be4b780754bfc2e78a16.png

这就相当于一个隐藏炸弹💣,你不知道什么时候会爆炸。

编译时依赖关系注入

这个问题可以使用编译时依赖关系注入解决,伪代码如下:

public WeatherForecastController Resolve()
{var repository = new RepositoryImpl();return new WeatherForecastController((IRepository)repository);
}

通过直接写出生成类实例的代码,一旦没有生成依赖关系的实例,或者依赖关系的实例类型不对,编译时就会报错,我们可以立刻觉察到问题。

但是,全手写这样的代码也不现实,而且一旦修改依赖关系,代码就必须大量重构。

有不有更简单的方案?

StrongInject

StrongInject是一个用于实现编译时依赖关系注入的类库,如果你要解析的类型未注册,则会在编译时而不是运行时报错。

下面,我们用一个例子来演示如何使用StrongInject。

1.引用Nuget包

创建ASP.NET Core Web API项目,然后引用如下Nuget包:

StrongInject.Extensions.DependencyInjection

2.注册Controller

修改Startup.cs:

public void ConfigureServices(IServiceCollection services)
{//services.AddControllers();services.AddControllers().ResolveControllersThroughServiceProvider();services.AddTransientServiceUsingContainer<Container, WeatherForecastController>();
}

告诉ASP.NET Core使用Container类解析Controller的依赖关系。

3.依赖关系注入

新建Container.cs:

[Register(typeof(WeatherForecastController), Scope.InstancePerResolution)]
[Register(typeof(DemoRepository), Scope.SingleInstance, typeof(IRepository))]
public partial class Container : IContainer<WeatherForecastController>
{
}

注册IRepository的实现为DemoRepository,其中Scope是生成实例的方式:

  • InstancePerResolution:单个实例在为单个Controller创建的所有依赖项之间共享。例如,如果A依赖B和C,而B和C依赖于D的实例,那么当A被解析时,B和C将共享相同的D实例。

  • InstancePerDependency:每次使用都会创建一个新实例。例如,类型B在A的构造函数中定义了两次,那么两个不同的实例将被传入构造函数。

  • SingleInstance:一个实例将在所有Controller的所有依赖项之间共享。

4.编译

编译代码,可以看到StrongInject是基于Source Generators实现,为WeatherForecastController生成了依赖注入解析代码:

07f3fbda74d7cd9e6dd1d8231fa5dd97.png

如果我们在WeatherForecastController中增加一个依赖:

public WeatherForecastController(IRepository repository, ILogger<WeatherForecastController> logger)

由于依赖没有注册,编译时报错:

671f01925aae8fc80f1e6e76e6b30462.png

结论

除了实现了编译时依赖关系注入功能,由于StrongInject基于Source Generators实现,没有字典查找,也没有运行时代码生成,因此依赖关系解析速度相对于运行时注入应该要快很多。

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

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

相关文章

使其正序排序 打印一串数字_JavaScript计数排序算法

一、计数排序算法计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于1954年由 Harold H. Seward 提出。计数排序使用一个额外的数组&#xff0c;数组的下标对应待排序的数字。然后根据新数组的下标来获得正确的顺序。就像给每个位置按数字顺序做好标记&#xff0c…

shiro real的理解,密码匹配等

1 、定义实体及关系 即用户-角色之间是多对多关系&#xff0c;角色-权限之间是多对多关系&#xff1b;且用户和权限之间通过角色建立关系&#xff1b;在系统中验证时通过权限验证&#xff0c;角色只是权限集合&#xff0c;即所谓的显示角色&#xff1b;其实权限应该对应到资源&…

ASP.NET-----Repeater数据控件的用法总结(转)

ASP.NET-----Repeater数据控件的用法总结(转) 一、Repeater控件的用法流程及实例&#xff1a; 1、首先建立一个网站&#xff0c;新建一个网页index.aspx。 2、添加或者建立APP_Data数据文件&#xff0c;然后将用到的数据库文件放到APP_Data文件夹中。 3、打开数据库企业管理器&…

Jenkins修改管理员密码.

前言&#xff1a;Jenkins修改管理员密码&#xff0c;我看了网上所有的教程&#xff0c;竟然全都是拿着一串已经加密好的111111的密文去替代config.xml文件里面的密码&#xff0c;然后大家的密码都是111111&#xff01;我觉得这种做法实在太敷衍了&#xff01;于是我就研究了下&…

截取指定字符前_VBA学习笔记35-1:字符串拆分与组合

学习资源&#xff1a;《Excel VBA从入门到进阶》第35集 by兰色幻想本课的示例都在立即窗口展示运行结果&#xff0c;要在立即窗口展示的话要使用“Debug.Print”。Debug.Print 将代码执行结果显示在“立即窗口”中&#xff0c;但不影响程序执行。一、字符串截取1.left,right,mi…

c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!

简介Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下&#xff0c;就构建出我们想要的对象。Clay和ExpandoObject相比&#xff0c;提供了更加灵活的语法支持&#xff0c;让我们像写javascript代码一样写C#代码&#xff0c…

7 种 JavaScript 技巧使你更聪明

1.总是颠倒逻辑 让我们从一个小优化开始&#xff0c;目的是为了使得非常简单的操作看起来复杂些。 if (x && y) { … } // bad if (!(!x || !y)) { … } // good2.在你的变量名字里使用扩展的unicode字符 编译好的软件一旦发布成产品&#xff0c;它必须是一个黑盒。这对…

设置访问权限_【新思考教学者思】李世松:不要对经典设置访问权限

不要对经典设置访问权限——《背影》备课札记文/李世松紫阳县举办课堂教学改革推进会&#xff0c;师训教研中心王主任电话通知我讲一节示范课。我知道&#xff0c;这既是对我的一种肯定&#xff0c;更是一次磨炼&#xff0c;因为我的师父邱俊老师会到现场点评课堂。自领受任务之…

C#使用Objects Comparer进行对象比较

介绍Objects Comparer是用于对象比较的工具&#xff0c;c#常见的数据结构都是可以用这个三方库进行对比&#xff0c;比较复杂的对象也是可以比较的。简而言之&#xff0c;Objects Comparer 是一个对象到对象的比较器&#xff0c;它允许逐个成员递归得比较对象&#xff0c;并为某…

ora22813操作数值超出系统的限制_最新:华为“鸿蒙”操作系统终于面世!一旦遭到限制,将随时启用...

受美国的要求&#xff0c;自5月开始&#xff0c;安卓暂停了与华为的部分合作&#xff0c;而这直接影响到了华为对安卓系统的正常更新。迫于无奈之下&#xff0c;华为对外表示&#xff0c;已经准备了备用系统&#xff0c;但只在必要的情况下使用&#xff0c;而这一系统就是广为人…

Blazor University (2)布局 — 创建 Blazor 布局

原文链接&#xff1a;https://blazor-university.com/layouts/布局Blazor 布局类似于 ASP Webforms 母版页的概念&#xff0c;与 ASP MVC 中的 Razor 布局相同。几乎网络上的每个网站都有一个模板用于整个网站&#xff08;页面顶部的品牌&#xff0c;底部的版权&#xff09;或网…

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一、plist文件和项目结构图 说明&#xff1a;这是一个嵌套模型的示例 二、代码示例&#xff1a; YYcarsgroup.h文件代码&#xff1a; 1 //2 // YYcarsgroup.h3 // 07-汽车展示&#xff08;高级&#xff09;4 //5 //…

awb数据怎么计算_白平衡自己主动(AWB)算法---2,颜色计算

本文说明了白平衡算法估计当前场景的色温过程.色温计算的原理并不复杂,但要做到,还是一道&#xff0c;认真做好每一步,这需要大量的测试,和算法一直完好.关于该过程首先简要:1, 取的图像数据,并划分MxN块,如果是25x25,并统计每一块的基本信息(,白色像素的数量及R/G/B通道的分量…

svn强制要求提交注释

2019独角兽企业重金招聘Python工程师标准>>> 看了N多资料&#xff0c;不知道为什么我总是不成功。现在终于测试成功了&#xff0c;下面是实际操作过程~~ 使用bitnami一键安装了subversion&#xff0c;在使用中&#xff0c;希望开发人员提交时必须输入日志内容&#…

Xamarin效果第五篇之ScrollView动态滚动效果

前面基于Xamarin做了一点效果;这不过年从老家回来一直成沉迷工作无法自拔,没时间来更新文章了;今天赶紧抽点时间再来更新一下效果;直接看看最终实现的效果:前台RadioButton的事件绑定选中状态绑定:后台对ScrollView的滚动处理:ScrollView的滚动对当前选中状态的修改&#xff1a…

9 个使用前必须再三小心的 Linux 命令

Linux shell/terminal 命令非常强大即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下Linux 甚至不会询问你而直接执行命令导致你丢失各种数据信息。 一般来说在 Web 上推荐新的 Linux 用户执行这些命令当然也有人哪些写过这代码的人不这么想因为…

池化层在全连接层之间吗,了解最大池化层之后的全连接层的尺寸

In the diagram (architecture) below, how was the (fully-connected) dense layer of 4096 units derived from last max-pool layer (on the right) of dimensions 256x13x13? Instead of 4096, shouldnt it be 256*13*1343264 ?解决方案If Im correct, youre asking why …

Blazor University (3)组件 — 创建组件

原文链接&#xff1a;https://blazor-university.com/components组件所有呈现的 Blazor 视图都来自 ComponentBase 类&#xff0c;这包括布局、页面和组件。Blazor 页面本质上是一个带有 page 指令的组件&#xff0c;该指令指定浏览器必须导航到的 URL 才能呈现它。事实上&…

Codeigniter中创建LeanCloud云函数实现微信支付

2019独角兽企业重金招聘Python工程师标准>>> 经过摸索&#xff0c;与官方提供的slim无异&#xff0c;同样使用__invoke魔法函数即可&#xff0c;步骤如下&#xff1a; 1.config.php打开hook&#xff0c;即设置$config[enable_hooks] TRUE; 详情文档参见&#xff1a…

用蒙特卡洛方法计算派-python和R语言

用蒙特卡洛方法算pi&#xff0d;基于python和R语言 最近follow了MOOC上一门python课&#xff0c;开始学Python。同时&#xff0c;买来了概率论与数理统计&#xff0c;准备自学一下统计。&#xff08;因为被鄙视过不是统计专业却想搞数据分析&#xff09; 有趣的是书里面有一块讲…