QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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

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

关注

评论

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

正确学习大数据开发技术的方法有哪些

@零度

大数据

Apollo生产环境整合springboot

小鲍侃java

11月日更

java语言前景怎么样,到底需不需要参加培训

@零度

Java JAVA开发

Vue都使用那么久了,还不了解它的生命周期吗

CRMEB

解决 Serverless 落地困难的关键,是给开发者足够的“安全感”

阿里巴巴中间件

阿里云 Serverless 技术 云原生 中间件

智能云分支(Cloud Intelligent Branch)方案正式发布!

阿里云 云网络 智能化 发布会

Linux学习有用吗?《Linux一学就会》

侠盗安全

Linux linux运维 云计算架构师 linux电子书

首发!OceanBase社区版入门教程开课啦!

OceanBase 数据库

数据库 开源 新闻 课程 oceanbase

Python代码阅读(第62篇):列表是否包含相同元素判断

Felix

Python 编程 列表 阅读代码 Python初学者

StarRocks Hacker Meetup 小记 Part 2|实时更新场

StarRocks

大数据 Meetup StarRocks

智能运维中的指标预测

云智慧AIOps社区

算法 智能运维 预测 指标

使用 NextJS 和 TailwindCSS 重构我的个人博客

狂奔滴小马

大前端 Blog nextjs

我们如何实现“业务 100% 云原生化,让阿里中间件全面升级到公共云架构”?

阿里巴巴中间件

阿里云 云原生 中间件 三位一体

管理纪要

KoLee

百亿级存储+毫秒级写入!TDengine如何轻松玩转“潮鞋”APP?

TDengine

tdengine 时序数据库

HBase 的预分区及 rowkey 设计技巧

五分钟学大数据

11月日更

Hadoop 生态里,为什么 Hive 活下来了?

大数据技术指南

11月日更

数据可视化界的小公主:cutecharts,入门+实战应用

老表

Python 数据可视化 11月日更 实战案例 cutecharts

一起来写 VS Code 插件:实现一个翻译插件

狂奔滴小马

JavaScript vscode 大前端 vs

Android C++系列:Linux进程间通信(一)

轻口味

c++ android 11月日更

入驻快讯|欢迎ShowMeBug正式入驻 InfoQ 写作平台!

InfoQ写作社区官方

零基础学习前端开发技术的方法分享

@零度

大前端

图论算法:稳定婚姻问题,如何找到最适合自己的另一半

博文视点Broadview

一起来写 VS Code 插件:VS Code 版 CNode 已上线

狂奔滴小马

JavaScript vscode 大前端

使用 Omnibus 安装极狐GitLab

极狐GitLab

极狐GitLab 安装使用

百度Q3财报:百度智能云同比增长73%,稳居中国四朵云之一

百度大脑

人工智能

一起来写 VS Code 插件:为你的团队提供常用代码片段

狂奔滴小马

vscode 大前端

用 NodeJS 开发一版在线流程图网站

狂奔滴小马

JavaScript 大前端 Node

Apache ShardingSphere 企业行|走进转转

SphereEx

ShardingSphere SphereEx Apache ShardingSphere 转转

人脸检测实战:使用opencv加载深度学习模型实现人脸检测

AI浩

今日谈:BoltDB数据库,一款纯Go实现的KV数据库

恒生LIGHT云社区

数据库 Go 语言 BoltDB

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