加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

ASP.NET Core 奇淫技巧之伪属性注入的实现

发布时间:2020-08-22 19:26:32 所属栏目:编程 来源:网络整理
导读:这篇文章首要先容了ASP.NET Core 奇淫能力之伪属性注入的实现,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下
副问题[/!--empirenews.page--]

开局先唠嗑一下,许久不曾更新博客,一向在调解本身的状态,客岁是我的本命年,或者是应验了本命年的多难多灾,过得异常不顺,岂论是糊口上照往事变上。还好当我渡过了所谓的本命年后,很多工作都在逐步变好,我将会开始规复更新博客,争取规复到早年的速率上(由于事变较量忙,以是这个进程也许必要一段时刻)。

二.关于属性注入

说到属性注入,我们就不得不提一下 DI(Dependency Injection),即依靠注入,用过 ASP.NET Core 的同窗信托对这个词不会生疏。ASP.NET Core 自带了一个IOC容器,且措施运行也是基于这个容器成立起来的,在 Startup 里的 ConfigureServices 要领就是向容器注册范例。最直白的讲,我们在 ASP.NET Core 中,想行使某个范例的时辰可以不消本身去 new,可以由容器通过结构要领来注入详细的实现范例,而我们一样平常在结构要领上界说的依靠范例都是接口,而不是去依靠详细的实现,这里就浮现了 SOLID 原则中的依靠倒置原则(DIP)。这也是IOC(Inversion of Control),即节制反转,不直接依靠详细实现,将依靠交给容器去节制。上述几者是具有必然的关联相关的,DIP 是一种软件计划原则,IOC 是 DIP 的详细实现方法,DI 是 IOC 的一种实现方法。

在依靠注入时,我们最常用的即是通过结构要领注入,尚有另一种方法那即是属性注入。

关于属性注入,假如在网上搜刮,大部门内容都是不保举行使,可能说稳重行使的,由于属性注入会造成范例的依靠相关潜匿,测试不友爱等,我也赞成这种说法,属性注入可以行使,可是要审慎,不能盲目行使。我的原则:在封装框架(摆架子)时可以行使,但不能大范畴行使,只有必需行使属性注入来到达结果的处所才会行使,用来进步行使框架时的编码服从,来到达一些便利,离开框架层面,编写营业代码时,不得行使。

在 ASP.NET Core 中,自带的容器是不支持属性注入的,可是可以通过替代容器,如:Autofac 等来实现。本日我分享的要领不是行使替代容器,而是通过几行代码来实现属性注入的结果,我称为“伪属性注入”。

三.属性注入办理的痛点

以下先容的痛点是我在现实编码进程中碰着的一些,假如尚有其他的,接待在评述和我交换

我所碰着的痛点,我归纳为三条:

1.镌汰常用的范例的一再注入代码,使结构要领看起来更为简捷,进步阅读性。

2.镌汰或消除因结构要领注入造成子类担任后的 base 挪用链。

3.并非是满意第一条或第二条就必要行使属性注入来办理,只有当第一、二条产生的环境达到必然的数目。

第一条:

以日记 ILogger<T> 为例,我们在 Controller 可能 应用处事层(Application Service)等编写营业的处所也许会常用,那么我们也许会在大部门的 Controller 可能 Application Service 的结构要领里写一句注入,例:

这里只是以日记来举例,我们还能碰着和日记这种沟通的范例,每个 Controller 等都要注入一堆这种配合的范例,代码编写起来也较量贫困,假如多了往后还影响代码阅读。

有何办理步伐,那就是界说一个基类,然后通过属性提供应子类,以 Controller 为例:

第二条:

在上面的Controller基类注入 ILogger,然后配置了 Logger 属性,这样子类就可以行使 Logger 属性来行使日记。

这样做每次都要挪用 base 将依靠工具转达给基类,假如担任相关有多层,将会造成更大的影响。

留意:本文演示只以日记来举例,假如只有一个ILogger我认为还可以忍受,现实环境中并非只有一个,好比当地化等等。博主不倡导有上面演示环境的就用属性注入,当达到必然数目才行使,好比在 Controller 可能应用处事这种数目多的工具以及当这些工具必要的配合的注入范例到达必然数目。

四. 伪属性注入焦点头脑

依托于 ASP.NET Core 自带的容器,在 Resolve Service 时,为必要“属性注入”的属性举办赋值,可以行使 自带容器提供的 ImplementationFactory 来实现。

五. 为 Controller 实现伪属性注入

Controller 的实现较为非凡,Controller 默认是不会通过自带容器来 Resolve&Activate 的,是通过MVC自身打点的,可是微软提供了这样的要领:

services.AddControllers().AddControllersAsServices();

可以通过挪用 AddControllersAsServices() 要领来让 Controller 行使自带容器,其首要源代码如下

按照第四末节的头脑,我们必要 Controller Resolve 时,来对属性举办赋值,那么我们必要改革 Controller 激活器。

界说 Controller 基类

Controller 担任基类

改革 Controller 激活器

可以看到我们改革的代码也就几行。

替代默认 Controller 激活器

services.AddControllers().AddControllersAsServices(); services.Replace(ServiceDescriptor.Transient<IControllerActivator, XcServiceBasedControllerActivator>()); //替代默认 Controller 激活器

运行测试

测试正常,如需其他属性的“属性注入”,参考日记这样做就行了。

六. 为 Application Service 实现伪属性注入

只是以 Application Service 来作为讲授,同理可触类旁通到其他处所。Application Service 属于规模驱动分层架构中的一层,如不相识,可自行查找资料。

界说应用处事基类接口

public interface IAppService { ILogger Logger { get; set; } } public class AppService:IAppService { public ILogger Logger { get; set; } }

界说详细处事,以 User 处事为例

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读