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:091741
用户头像

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

关注

评论

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

QA应该更新的测试工具-2013

刘冉

软件测试

TDD之让我们再聊聊TDD(终)--正其思,规其行

刘冉

TDD

🔄 这些JS数组遍历是否都用过 🔄

空城机

JavaScript 大前端 11月日更

模块三 架构文档

Asha

重点人员管控系统开发方案,重点人员动态管理系统

电微13828808271

测试策略实践之序篇-软件缺陷,测试计划和测试架构

刘冉

测试计划 测试策略 测试架构

一场大戏!央行数字人民币被“点燃”!

CECBC

springboot整合pagehelper

小鲍侃java

11月日更

敏捷开发:川中校友登记小程序解决方案

CC同学

应届生学的java,转自动化测试拿到15k薪资,送给大家的经验积分

六十七点五

Java 程序员 软件测试 自动化测试 测试工程师

13 K8S之Pod资源操作

穿过生命散发芬芳

k8s 11月日更

测试策略实践之分类漫谈

刘冉

数据流水线架构

俞凡

架构 数据

模块四作业-考试试卷-Redis存储方案设计

沐风

质量基础设施一站式服务平台方案,NQI一站式公共平台开发

电微13828808271

2022 年 9 个最佳 JavaScript IDE 和代码编辑器

devpoint

JavaScript vscode IntelliJ IDEA 11月日更

数据校验

卢卡多多

参数校验 11月日更

安全测试之XCodeGhost随想-2015

刘冉

软件测试 安全测试

TDD之让我们再聊聊TDD(续)

刘冉

TDD

博文|Apache Pulsar 在自研数据管道中的技术实践

Apache Pulsar

大数据 分布式 云原生 中间件 Apache Pulsar 消息系统

外包学生管理系统架构文档

zjluoyue

测试策略实践之测试自动化与自动化测试

刘冉

测试管理 测试策略

告别晦涩难懂的物理,《张朝阳的物理课》了解一下

脑极体

KoP 2.8.0 新特性前瞻(内附视频)

Apache Pulsar

kafka 架构 分布式 Apache Pulsar KoP 2.8.0

听说你还在写双层for循环解两数之和?

老表

Python LeetCode 11月日更 两数之和 算法与数据结构

一个基于web服务器的PoW案例(一)

Regan Yue

区块链 共识算法 11月日更

TDD之让我们再聊聊TDD

刘冉

TDD

和12岁小同志搞创客开发:手撕代码,做一款人体感应灯

不脱发的程序猿

少儿编程 DIY 智能硬件 创客开发 Arduino

周边生态 | StreamNative 宣布开源 AWS SQS Connector

Apache Pulsar

开源 云原生 消息中间件 AWS SQS Connector 周边生态

意外发现,原来你不知道自己每天都在用门面模式

Tom弹架构

Java 架构 设计模式

javaScript基础篇说一说循环应该怎么用

你好bk

JavaScript 大前端 ES6 html/css

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