10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

ASP.NET vNext 允许你自定义项目加载器以及对多种语言的支持

  • 2014-09-08
  • 本文字数:1413 字

    阅读完需:约 5 分钟

ASP.NET vNext 运行时会在实际运行 C#源代码之前使用 Rosylyn 编译器对代码进行编译并加载。 David Fowler 为大家演示了如何使用 KRuntime 加载程序的依赖注入功能,让你选择的编程语言也可以支持 vNext。

KRuntime 加载程序包含了创建并运行 ASP.NET vNext 应用程序所需要的全部功能,出于设计原则的考虑,运行时本身无法分辨何谓“设计时”这一概念,编辑与加载操作是同时发生的。由于这一原因,KRuntime 定义了多个独有的加载器,它们会从project.json 文件中读取全部依赖项,随后与项目本身的源代码一起进行构建。

项目引用(project reference)加载器的行为十分有趣,在默认情况下,它会调用 RosylynProjectReferenceProvider ,后者会返回一个 RosylynProjectReference 对象。正如其名称所显示的一样,它会使用 Rosylyn C#编译器对 C#源代码进行编译并加载程序集。

不过这一行为是可以被覆盖的,David Fowler 演示了相应的做法。

ASP.NET vNext 中对 F#的支持

让我们来看一下 David 在 github 上所创建的 vNextLanguageSupport 项目,他在项目中定义了一个 FSharpProjectReferenceProvider 类,实现了 IProjectReferenceProvider 接口。该类中的方法会返回一个 FSharpProjectReference 对象,后者则实现了 IMetadataProjectReference 接口。

FSharpProjectReference 在 Emit 方法中进行了一系列的操作:

  • 遍历项目引用
  • 将全部引用拷贝到某个临时文件夹中
  • 使用 fsc 编译器对源代码文件,以及这些引用进行编译
  • 删除临时文件

这两个类都可以在 FSharpSupport 项目中找到,因此可以将其编译后作为一个程序集进行引用。值得一提的是,虽然这两个类的实现是为了支持 F#,但它们自身是用 C#语言编写的。

David 随后在一个 F#项目示例中使用了这两个类,为此他特意在 project.json 文件中定义了 projectReferenceProviderType 属性。

(代码片段)

复制代码
"language": {
"name": "F#",
"assembly": "FSharpSupport",
"projectReferenceProviderType": "FSharpSupport.FSharpProjectReferenceProvider"
},

这样,你的 ASP.NET vNext 应用就能够支持 F#了。项目的启动类现在是一个F#类型,而不是C#类了。

虽然这个示例中只用到了F#,但你可以使用相同技术让任何CLR 语言都为ASP.NET vNext 所支持,所需的只是为IMetadataProjectReference 和IProjectReferenceProvider 接口提供你自己的实现。

Aleksander Heintz 也在多篇文章中针对 David 的示例进一步进行了详细解释:

项目加载器是如何运行的(请注意:这篇文章有些内容过时了,比方说RosylynAssemblyLoader 这个类现在已经不存在了)。

关于FSharpReferenceProvider 的更多细节

如何使用上述以C#代码实现的FSharpReferenceProvider 类,让它加载一个真正的F#实现(并使用该F#实现以加载F#源代码)!

这个示例本身并不复杂,但它为我们演示了KRuntime 所使用的内置依赖注入的强大功能,它为你在项目中加入新特性提供了许多灵活性。正如在 KRuntime 结构一文中所说明的一样,运行时的每一个层,包括原生进程层(Native Process)、寄宿层(Host)、托管入口点层(Managed Entry Point)以及应用程序寄宿层(Application Host),都是由依赖注入方式所解析的。(作为示例,KRuntime 能够通过Mono 运行在Linux 和OSX 操作系统上)。

ASP.NET vNext 代表了微软在 web 框架的构建及部署方面一次结构性的改变。

查看英文原文: ASP.NET vNext: Custom Project Loaders and Language Support

2014-09-08 00:091750
用户头像

发布了 428 篇内容, 共 194.7 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

一文详解RocketMQ的存储模型

华为云开发者联盟

开发 华为云 企业号 1 月 PK 榜

软件测试/测试开发丨iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

测试人

ios xcode 软件测试 自动化测试 测试开发

程序员面试中一面、二面、三面有什么区别?

小小怪下士

Java 程序员 java面试

云原生安全系列 4:6个 Kubernetes 安全最佳实践

HummerCloud

Kubernetes 云原生安全

为iframe正名,你可能并不需要微前端

阿里巴巴终端技术

前端 微前端 iframe

读 NebulaGraph源码 | 查询语句 LOOKUP 的一生

NebulaGraph

图数据库 源码解读

Serverless时代的微服务开发指南:华为云提出七大实践新标准

华为云开发者联盟

微服务 云原生 后端 华为云 企业号 1 月 PK 榜

DTALK直播预约 | 金融行业嘉宾分享:金融机构数据治理实践路径

袋鼠云数栈

双机热备的优点简单分析-行云管家

行云管家

高可用 双机热备

阿里云前端专家冯军:前端用户体验该如何优化

云布道师

阿里云

华为云发布CodeArts TestPlan测试管理平台 守护产品质量之魂

科技热闻

2022 Apache APISIX 年度记忆

API7.ai 技术团队

api 网关 APISIX 年终盘点 apache 社区

EMQ携“云边协同IIoT解决方案”亮相2022世界工业互联网产业大会

EMQ映云科技

人工智能 物联网 IoT 云边协同 企业号 1 月 PK 榜

ZooKeeper 避坑实践:SnapCount 设置不合理导致磁盘爆满,服务不可用

阿里巴巴云原生

zookeeper 阿里云 云原生

喜报!SelectDB 携手中航信移动科技有限公司、四川大数据技术服务中心,双双入选大数据“星河(Galaxy)”优秀案例

SelectDB

数据库 大数据 数据湖 云原生 云上架构

明天 9 点!Doris Summit 2022 拉开序幕,立即报名年度技术盛会!

SelectDB

数据湖 云原生 实时数仓 湖仓一体 数据库·

2022大厂投资盘点:最大的投资就是减少投资

ToB行业头条

TiDB 6.5 LTS 发布 企业级关键能力跃升

极客天地

技术管理 之 跨功能需求管理

码猿外

技术管理 非功能性需求 跨功能性需求

【双机热备小知识】两台服务器可以做双机热备吗?

行云管家

高可用 双机热备

OneFlow源码解析:静态图与运行时

OneFlow

人工智能 深度学习

js函数柯里化-面试手写版

helloworld1024fd

JavaScript

前端二面手写面试题总结

helloworld1024fd

JavaScript

ChatGPT的一小步,NLP范式转变的一大步

OneFlow

人工智能 深度学习

旅游业复苏在即,区块链赋能智慧旅游新体验

旺链科技

区块链 区块链技术 区块链技术应用

基于云基础设施快速部署 RocketMQ 5.0 集群

Apache RocketMQ

RocketMQ 云原生 消息队列

腾讯前端二面高频手写面试题总结

helloworld1024fd

JavaScript

极狐GitLab与欧拉操作系统完成兼容认证,开源产业自主创新再突破!

openEuler

Linux 开源 操作系统 openEuler 资讯

高并发环境下构建缓存服务,你需要注意这6点

华为云开发者联盟

高并发 开发 华为云 企业号 1 月 PK 榜

JS继承有哪些,你能否手写其中一两种呢?

helloworld1024fd

JavaScript

ASP.NET vNext允许你自定义项目加载器以及对多种语言的支持_C#_Roopesh Shenoy_InfoQ精选文章