依赖注入实现了系统之间、模块之间和对象之间依赖关系的解耦,基本上是现代应用程序框架必不可少的一个组成部分。
ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection),所以能够完全兼容.net Core中的依赖注入的用法,同时使用 Autofac 替换了.net Core中的内部容器,利用了Autofac中的一些特性。
与Asp.Net Core在Startup
类中的ConfigureServices()
方法中,通过IServiceCollection
向容器中添加依赖注入关系没有区别,在Abp框架中也完成兼容这种方式。
不过这些依赖关系的配置一般会在各自的模块中配置,而不是全部都写在Startup类中,这样使得各个模块之间更加独立,开箱即用。
[DependsOn(typeof(AbpAspNetCoreModule))]
[DependsOn(typeof(SuncereAbpDataModule))]
public class SuncereAbpFreeSqlModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddFreeSql();
}
}
示例中的代码是我们项目中一个ORM模块的依赖注入配置,这是模块基于FreeSql这个ORM框架进行了一层分组,兼容了Abp的工作单元、默认仓储模式。上一篇文章中讲在Abp框架初始化时,会将容器对象在各个模块类中进行传递,context.Services
就是传递过来的IServiceCollection
。
除了手动注册的方式之外,Abp框架依赖注入体系的很方便的一个点,就是提供了按照约定的自动依赖注入关系注册。最基本的,在只使用了Volo.Abp核心库的情况下,会将实现了特定接口的类进行注册,根据依赖注入的生命周期,Abp提供了三个接口。
• ITransientDependency 注册为transient生命周期.
• ISingletonDependency 注册为singleton生命周期.
• IScopedDependency 注册为scoped生命周期.
这些接口,都是空接口,起到标记的作用。这种设计方式,在微软的代码和很多框架中都很常见。
通过对源码的研究,可以发现这其实是Abp提供了一个约定注册器接口IConventionalRegistrar,并且Abp提供了实现默认的实现。并且在Abp引擎初始化的时候,将所有的模块程序集遍历了一遍,将其中满足约定的类进行了依赖注入注册。
查看自动依赖注入源码的入口点,其实就在上篇文章中提到的Abp引擎初始化过程中,AbpApplicationBase
构造函数中调用的AddCoreAbpServices()
方法中,其中的services.AddAssemblyOf<IAbpApplication>()
是关键。
可以看到,这里向集合中添加了默认预定注册器,并且通过规则进行依赖注入注册。那么规则注册器是如何查找程序集中的类,并且注册依赖关系的呢?
这里就看到了上面提到的三个接口了,但是从这里可以看出,这三个接口只是提供了生命周期的信息,但是依赖注入的注册,除了生命周期,还有类与接口的对应关系。
通过对DefaultConventionalRegistrar
、ConventionalRegistrarBase
、ExposedServiceExplorer
、ExposeServicesAttribute
代码的查看,可以明白Abp默认的依赖关系注册是怎么样的,以及它是怎么实现的。
默认规则注册:
1)实现了ITransientDependency等三个接口的公开、非泛型类,会被注册到容器中。
2)如果这个类实现了其他接口,并且这个接口和类之间的命名符合规则,接口和类的关系会被注册到容器中。
例如
public class BookRepository: IRepository, IBookRepository, IBookStore, ITransientDependency
{
}
上面的代码中,BookRepository
在容器中是可以找到三个依赖关系配置的。
除了默认规则注册之外,Abp还在其他模块中提供了其他的注册规则,如Volo.Abp.AspNetCore.Mvc模块中的AbpAspNetCoreMvcConventionalRegistrar
、Volo.Abp.AspNetCore.Components
中的AbpWebAssemblyConventionalRegistrar
等。
Abp框架固有的注册类型
一些特定类型会默认注册到依赖注入.例子:
• 模块类注册为singleton.
• MVC控制器(继承Controller或AbpController)被注册为transient.
• MVC页面模型(继承PageModel或AbpPageModel)被注册为transient.
• MVC视图组件(继承ViewComponent或AbpViewComponent)被注册为transient.
• 应用程序服务(实现IApplicationService接口或继承ApplicationService类)注册为transient.
• 存储库(实现IRepository接口)注册为transient.
• 域服务(实现IDomainService接口)注册为transient.
我们也可以通过实现自己的依赖注入注册规则,只需要实现IConventionalRegistrar
接口,并在模块类中的PreConfigureServices()
方法中将其添加到ConventionalRegistrarList
中。
从上面的源码中也可以看出,Abp框架也支持通过特性的方式声明依赖注入关系的,而且特性的声明方式会优先于默认约定的方式。
我们可以用 DependencyAttribute
声明依赖注入的生命周期和注入的方式,ExposeServicesAttribute
声明类和接口之间的对应关系。ExposeServicesAttribute
就是 IExposedServiceTypesProvider
的实现类。
特别注意的,在声明了ExposeServicesAttribute
,并且未设置IncludeDefaults
、IncludeSelf
的值的情况下,由于默认值的关系,这两个值会是false,即默认约定不起作用了,该类注册为ExposeServicesAttribute
中指定的接口的实现。 当然ExposeServicesAttribute
可以指定多个接口。
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(typeof(IBookRepository))]
public class BookRepository: IRepository, IBookRepository, IBookStore
{
}
通过源码可以知道,无论是按照约定自动注册,还是通过特性的方式进行注册,都是无法注册泛型类的依赖注入关系的,泛型类的依赖注入关系只能够通过手动注册的方式注入。
context.service.AddTransient<IRepository<,>, Repository<,>>();
通过以上方式可以注册泛型类的依赖注入关系,<> 中一个,表示该类有两个泛型类型。
以上是依赖注入配置部分的内容,这里拆成了两篇,避免文章太长大家阅读不适
ABP 系列总结:
目录:ABP 系列总结
上一篇:ABP - 模块加载机制
大家好,又见面了,我是你们的朋友全栈君。整理收集一些自己遇到的面试题及部分大家的题,自己来作答,回答不妥或者不全的还请大家指正网络(一)简单描述下TCP协议TCP:传输控制协议,是传输层通信协议。它有面向连接、可靠、字节流传输等特点 TCP建立连接时,需要三次握手协议 TCP三次握手的过程如下:客户端发送SYN报文给服务端,进入SYN_SEND(SEQ=X)状态 服务端收到SYN报文,回应一个SYN(SEQ=Y)ACK(ACK=X+1)报文,进入SYN_RECV状态 客户端收到服务端的SYN报文,回应一个ACK(ACK=Y+1)报文,开始建立连接 TCP/IP作用是什么?TCP/IP协议是一套网络通信标准,让全世界的各种不同的设备之间可以进行通信TCP与UDP的区别?TCP传输控制协议。UDP用户数据报协议 TCP对资源要求比较多,UDP对资源要求比较少 TCP可以保证数据的正确性,UDP有可能会丢包 TCP可以保证数据的顺序,UDP不会保证(二)网络7层模型是那7层?列举一些具体的应用实例从下到上,物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 物理层:同轴电缆、接收器、
【新智元导读】2022年6月,虚拟货币界的大型交易所Celsius、币安等纷纷宣布短期冻结一切转账和提款交易。加密货币界又双叒叕传出灾害性新闻了。虚拟币平台Celsius冻结存款2022年6月中,大型加密货币借贷平台Celsius,宣布把平台上所有提款、换币、转账的业务全部冻结暂停。给出的理由是,因为「在极端市场状况中」,「为了稳定流动性与运营」不得以而为之。两天后,Celsius的客户接受采访表示,「完全不清楚自己存的钱会怎么样。」另外3名客户表示,「系统显示,在解冻之前,自己的钱压根提不出来。而何时能解冻又是个未知数。」这3位客户在Celsius都存有2300到105000美元。客户们的感受证明,之前说好的,去中心化金融可以赋予每一个个人权利。然而一到出了问题的时候,直接就把客户架在了一个尴尬的位置。去中心化的金融服务能提供的保障甚至连传统银行账户都不如。Celsius的经营模式,是收取客户的加密数码货币储蓄,再把虚拟币借贷给别的个人或者公司,以此获得高额的汇报。说白了,这就是虚拟货币界的银行。就拿5月来说,这家成立了差不多5年的公司管理着来自170万客户群的118亿美元。但是,整
AngularJS为HTMLDOM元素的属性提供了绑定应用数据的指令。ng-disabled指令ng-disabled指令直接绑定应用程序数据到HTML的disabled属性。AngularJS实例<divng-app=""ng-init="mySwitch=true"> <p> <buttonng-disabled="mySwitch">点我!</button> </p> <p> <inputtype="checkbox"ng-model="mySwitch">按钮 </p> <p> {{mySwitch}} </p> </div> 复制实例讲解:ng-disabled指令绑定应用程序数据"mySwitch"到HTML的disabled属性。ng-model指令绑定"mySwitch"到HTMLinputch
材料和方法1.微阵列数据分析所有的微阵列表达数据下载与GEO数据库。Raw.CEL文件用bioconductor的affy包进行RMA。数据集的选择依据以下几个质量控制标准:可靠的并且高覆盖率的微阵列平台(AffymetrixHGU-133plus2.0),清晰的实验设计,重复足够数目(细胞系>=3,病人样本>=5),统一的cellcomposition,PCA结果和实验设计已知(比如样品可以从不同类进行清晰分类)。在从Affymetrix向NCBIentrez-gene转换后,执行富集分析,使用的是bioconductorhgu133plus2package。2.雌激素处理的乳腺癌细胞微阵列数据(GSE11352)由18个samples组成,6classes,每个3个重复(6classes指的是3个时间点,雌激素处理和未处理)。这些系列由12和24小时时间点组成,GSEA进行分析,t-test,2000gene-setpermutations。在case1和case2中,GM使用的富集阈值是:名义p-value<0.001,FDR<5%.overlapcoef
在简书上写东西,为了让更多合适的人看到,我们不得不做一些和写作无关的事。比如给专题投稿。有人会做的更多,如:给新的粉丝发介绍自己的简信;将粉丝进行分类,当写了新文章后,简信推送给合适的粉丝等等。这时候,你可能会好想有个助理帮你打理简书,而你可以专注在写东西上。如果你明确知道如何运营你的简书,恰巧又会写代码~那么很多助理做的事,可以用程序来实现。下面我列举一些程序能做的事。给专题投稿当一篇文章写完后,一般会给固定的一些专题投稿。这种重复枯燥的活,最适合程序来做了~程序实现见这里。给粉丝打标签(也可以说是分类)第1步。先看一些粉丝的信息,对你的粉丝有一定的了解。如:他的自我介绍,喜欢的文章,关注的作者和专题,写的文章等等。第2步。将粉丝信息,结合你的写文章的类型,定几个标签。比如,你写的是健身类文章,那你定的标签可以是:未开始健身,健身小白,健身爱好者,技术流健身者,活跃的分享者,打赏狂人等。第3步。定义每个标签的可度量的标准。比如,健身爱好者我们这么定义:在简书上创建了一个以上名字中带健身关键字的文集,同时关注了3个以上健身主题的作者和专栏。第4步。将每个粉丝根据标签标准,打上标签。粉丝
文件的概念(流文件缓冲区),文件的打开,文件的关闭,读写文件(字符、二进制)(顺序随机)文件:程序文件(.c.cpp.java.exe);数据文件(.dat)广义的文件:程序数据输出到磁盘或其他外部设备,称为文件。流:从主机到磁盘的输入输出是数据传送的过程,数据如同流水一样从一处流向另一处,因此通常将输入输出形象的描述为流(stream),即为数据流。在C语言中,把文件可以看作一个字符(或字节)的序列,即由一个一个字符(字节)的数据顺序组成的。一个输入输出流就是一个字符流或字节流。文件名:文件名是由3部分组成的(D:\DD\TEMP\file.dat)文件的路径文件名主干文件的后缀名文件缓冲区是指文件系统会自带在内存中为程序的每一个文件开辟一个文件的缓冲区。从内存向磁盘输出数据时,必须先将数据发送到文件缓冲区中,在文件缓冲区装满后才一起将数据输出到磁盘。文件指针:表示一个可以指向文件的指针。int*p
1.接口描述接口请求域名:cfs.tencentcloudapi.com。 解除文件系统绑定的快照策略 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:UnbindAutoSnapshotPolicy。 Version 是 String 公共参数,本接口取值:2019-07-19。 Region 是 String 公共参数,详见产品支持的地域列表。 FileSystemIds 是 String 需要解绑的文件系统ID列表,用","分割 AutoSnapshotPolicyId 是 String 解绑的快照ID 3.输出参数 参数名称 类型 描述 AutoSnapshotPolicyId Str
昨天的那篇博文恰恰是实验室所干的事儿 但是那是一种很投机取巧的方式完成的多project管理方式 来看看我建立环境的方法 首先,找一个比较闲的公用服务器(为什么不用自己的?有公共资源不用,你傻啊?),这里我用的是wl22这台服务器 找到这个服务器上的一个闲置用户(就是没人用的账号,其实只是利用这个账号真身在这台服务器上的特性,好操作罢了) 之后比如我用的是junze这个用户,要把我的svn的服务器建起来,只需要根据下面几个步骤来就好 cd~ mkdirsvn_root svnadmincreate--fs-typefsfs/home/junze/svn_root/project_1 svnadmincreate--fs-typefsfs/home/junze/svn_root/project_2复制 这里要注意的是,只需要建立母目录/home/junze/svn_root之后用svn的命令去建立底下的project目录,接下来import进内容 svnimport/home/ql/project_1file:///home/junze/svn_root/project_1-m"I
序言 当今社会广告随处可见,广告展现在大家面前也各尽不同,如电视、报纸、网络、车站、公车等等应有尽有,广告是无处不在,如不想见到广告那就不要出门、不要打开电脑手机、这样或许能暂时看不到广告。从这可见广告在人们生活中起到的作用,很多人都会根据广告去购买相关商品,所以现在才导致越来越多的企业不惜重金去打广告。然而广告又是人们非常讨厌的东西,比如在看电视时突然给你来一段广告,哎...广告泛滥的年代,你我都是广告受害者。 我今天给大家介绍一个广告一体机的实现思路,供大家一起交流学习,共同进步。也许我说的不是很好的思路,仅供参考。 一体广告机介绍 我所介绍的广告机就是一台大家可能都见过的,如机场、车站等等场所都能看见,它是一台立体的广告机,里面有一台电脑主机,一块比较大的触摸屏,这样可能就可以组装成一台一体机了。而我们的一体机还集成了发卡机(会员注册会将用户信息写入到卡片中,再发卡片
只会80pts. 最裸的暴力(40pts) 令$f[i][j]$表示当前DP到$i$,划分成了$j$段的最小值. 时间复杂度$O(n^2)$ 一点优化(60~80pts) 有几个测点$a[i]$很小,那么可以直接开一个桶$s[i][j]$表示前缀异或和为$i$,且划分$j$段的最小值. 修改复杂度:$O(1)$,查询复杂度$O(v)$,总复杂度$O(nv)$. 还可以在$trie$树上乱搞,不知道能拿多少分. 正解 分块. 我们发现$60$分解法中查询和修改复杂度差异很大,所以考虑用分块去平衡上述复杂度. 由于数字最大是$2^{16}$,所以考虑维护$mi[x][y]$表示一个数的前$8$位是$x$,去匹配一个后$8$位为$y$的贡献. 那么这个修改起来的话只需要枚举后面的$y$,复杂度为$O(\sqrtv)$.
我要的是能在H5页面上跑的javascript版的Box2D啊!!! 最近想学习Javascript版本的Box2DJS物理引擎,无奈搜了半天也没找到相对比较系统的资料 官方网站也只是简单的介绍,API还引导向了FLASHAS3脚本。 我要的是能在H5页面上跑的javascript版本的教程啊!!! 后来搜出了一本中文版Box2DforFlashGames,脚本是AS3版本的书。是由天地会(昵称:鲁邦三世)翻译的 看,书封面 没有Javascript版本的啊。点解?(υ◉ω◉υ) So...我感觉上帝选中了我⋋(◍’Θ’◍)⋌ 以前的我是AS3脚本程序猿出生,那么唯有用我丢掉的几年AS3脚本经验把它改写成Javascript版本的了,谁让我现在写的是Javascript呢。 看…我做的封面 完美!!! 用Fireworks把原来的封面做成了javascript,可见我功力了吧,请叫我美工殿下! 我最早是做美工出生我会跟你说?(/ ̄(エ) ̄)/ 好吧,那我就一边学,一边改成javascr
目前主流的ARM架构与X86方案应该是大家一直在疑惑的他们的区别在那里,各自的优势在那里,今天我就带大家介绍的是arm架构和x86架构的区别。 首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能、扩展能力、操作系统的兼容性、软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了arm架构和x86架构的区别,具体看如下: 什么叫arm架构 ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性。 在今日,ARM家族占了所有32位嵌入式处理器75%的比例,使它成为占全世界最多数的32位架构之一。ARM处理器可以在很多消费性电子产品上看到,从可携式装置(PDA、移动电话、多媒体播放器、掌上型电子游戏,和计算机)到电脑外设(硬盘、桌上型路由器)甚至
#函数由来解决了以下2个问题: #1.代码重复过多; #2.如果日后需要修改代码,那你就需要在所有用到这段代码的地方都修改一遍,函数方便后期好修改 #只需要把重复的代码提取出来,放在一个公共的地方,起个名字,以后谁想用这段代码,就通过这个名字调用就行了 #函数是什么? #函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中 #也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。 #函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 #特性: #1、减少重复代码:主要作用 #2、使程序变的可扩展:需要新增功能直接围绕函数添加就行, #3、使程序变得易维护: #语法定义 #defhello():#定义方式 #print("helloword!") # #hello()#直接调用 #升级模式:带参数_—————
方法1:CentralAdministration>SystemSettings>Manageserversinyourfarm(/_admin/FarmServers.aspx) 方法2:WindowsPowerShell:(get-spfarm).buildversion 详细列表 SP1是15.0.4569.1000(reRelease15.0.4571.1000) 十月CU是15.0.4551.1001 BuildNumber BuildName Component InformationLink DownloadLink Notes 15.0.4128.1014 Beta SharePointFoundation2013 Download Bugs,Notes,&Regressions 15.0.4128.1014 Beta SharePointServer2013 Download 15.0.4128.1014 Beta ProjectServer2013 &
(PS:前言:必读 看了一些人的评论,感觉有些人真的很浮躁,连文章里所阐述的中心都没搞清楚就给你扣上一个个大帽子,浮躁的心是我们做技术的大忌,我奉劝那些人,看文章要认真,不然真的只能徒增笑料,在这里我简要说明文章里所表达出来的中心思想,这是以前我们小学学语文所必备的技能。 1.逆向工程不是你想的那样,逆向工程具有研究意义 2.不要纠结于软件是否被破解,也许那是好事,只要你的源代码在你手上就行 3.提高软件质量,提高售后服务是你软件长久成功的基础 4.作为软件开发者,对自己自信是非常重要的 4.开源很好,有轮子大家一起用,没必要自己去造轮子 我从没有哪个字段说,我用破解我自豪什么的,我在这也不是鼓励大家去用破解软件,上述几点才是我真正要表达的意思 ) 昨天发了一篇破解P******的文章,让我非常愕然的是会引来这么大的反响,由于之前博客写得少,也不太明白博客园的大趋环境是什么,但是有一点我可以感觉到,有相当部分的兄弟对破解持着非常偏执的意见,所以我只能另开一篇文章来解释逆向工程的利与弊。 &nb
写完这篇就可以去睡觉了qwq.... 困困困困 1631:NOIP2012同余方程(mod) 题目描述 求关于x的同余方程ax ≡1(mod b)的最小正整数解。 输入 输入只有一行,包含两个正整数a, b,用一个空格隔开。 输出 输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。 样例输入 310 样例输出 7 提示 对于40%的数据,2≤b≤1,000; 对于60%的数据,2≤b≤50,000,000; 对于100%的数据,2≤a, b≤2,000,000,000。 感觉自己这道题好像写的挺对的 就不解释了吧 算了不解释会被骂的还是解释吧 (好像终于发现了初中数学竞赛的一点点好处) 把问题转化一下。它的实质是ax+by=1 其实这个式子我也不知道自己是怎么推出来的,好像是找规律试出来的吧 总感觉跟费马小定理挺像 不写辽...(谁能告诉我上面的横线怎么去掉..... 下面这个emmmmm #include<iostream>#include<cstdio> usingnamesp
原文地址:https://blog.csdn.net/u013022210/article/details/777405191.以下为报错具体详情;node8.1.2版本问题:其他空间安装成功但是安装webpack总是报以下错误:解决办法为重新安装node 2.npm模块管理器来自《JavaScript标准参考教程(alpha)》,by阮一峰目录简介npminitnpmsetnpmconfignpminfonpmsearchnpmlistnpminstall基本用法安装不同版本避免系统权限npmupdate,npmuninstallnpmrun参数scripts脚本命令最佳实践pre-和post-脚本内部变量通配符npmlinknpmbinnpmaddusernpmpublishnpmdeprecatenpmowner其他命令npmhome,npmreponpmoutdatednpmprunenpmshrinkwrap参考链接简介npm有两层含义。一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org。另一层含义是Node默认的模块管理器,是一个命
本文转自OSCHINA 写了一个demo,这个实例,只针对单一的实体bean,日后在补充其他示例 实体bean BaseColumn.java packageorg.mo.ormlite.entity; importcom.j256.ormlite.field.DatabaseField; importjava.io.Serializable; /** *Createdbymoziqion2015/1/180018. */ publicabstractclassBaseColumnimplementsSerializable{ @DatabaseField(generatedId=true,columnName="_id") privateLongid; @DatabaseField(columnName="create_date") privateStringcreateDate; @DatabaseField(columnName="update_date") privateStringupdateDate; //getset自己补充 } 复制 User.java
1.下载网站:https://ffmpeg.zeranoe.com/builds/ 先后下载Win32Shared和Win32Dev两个版本,分别解压缩。 2.用VisualStudio创建项目,选择“CreatenewprojectfromexistingCodefiles” 3.设置includepath和librarypath,sampleasfollow,记得把Shared里面的dll拷贝到debug目录。 1<?xmlversion="1.0"encoding="utf-8"?> 2<ProjectDefaultTargets="Build"ToolsVersion="15.0"xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 3<ItemGroupLabel="ProjectConfigurations"> 4<ProjectConfigurationInclude="Debug|Win32"> 5<Configuration>Debug&