架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15835|回复: 1

[.NET Core] ASP.NET Core(三)使用 ActivatorUtilities 动态创建实例

[复制链接]
发表于 2020-12-1 13:50:31 | 显示全部楼层 |阅读模式
回顾:

ASP.NET Core(一)使用 Redis 缓存
https://www.itsvse.com/thread-9393-1-1.html

ASP.NET Core(二)通过代码自重启应用
https://www.itsvse.com/thread-9480-1-1.html

通常实例化对象,是用 new 关键词来实例化一个类

C# 在类工厂中动态创建类的实例,所使用的方法为:


Activator.CreateInstance (Type)
Activator.CreateInstance (Type, Object[])


首先,我们定义一个 ITest 接口,如下:

定义两个实现类,分别为:TestA、TestB,代码如下:

其中 TestB 有非空的构造函数

TestB 类中 GetUserName 方法需要通过 IConfiguration 读取配置文件,然后和传入参数拼接,返回返回值。

配置文件如下:



我们通过动态加载 dll,通过反射的方式创建对象,分别通过 Activator 和 ActivatorUtilities 实例化对象,代码如下:

返回结果:

ret
"hello itsvse.com"
ex.Message
"No parameterless constructor defined for type 'ClassLibrary1.TestB'."

ret
"hello itsvse.com"
ret
"aaaa itsvse.com"

在使用 Activator 创建 TestB 对象的时候,会报错:No parameterless constructor defined for type 'ClassLibrary1.TestB'.

通过 ActivatorUtilities 分别创建 TestA、TestB 都不会报错,调用方法,都可以正常执行,效果图如下:


QQ截图20201201134016.jpg

在 .NET framework 中使用 Activator 实例化对象,没有任何问题,但是,在 asp.net core 中,引入了 IOC 和 DI 的概念,很多对象都不是无参构造函数,都需要传入相应的实现类才可以。

其中 _services 静态变量定义如下:

CreateInstance(IServiceProvider, Type, Object[])
参数

provider
IServiceProvider
用于解析依赖项的服务提供程序

instanceType
Type
要激活的类型

parameters
Object[]
不是由 provider 提供的构造函数参数


参考:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.dependencyinjection.activatorutilities.createinstance?view=dotnet-plat-ext-3.1

(完)




上一篇:移动和桌面端OAuth2.0安全分析和CodeVerifier机制
下一篇:使用 jsc 将 javascript 生成 dll 供 c# 调用
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-22 20:31:33 | 显示全部楼层
学习学习。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-19 03:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表