速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

关注

评论

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

深耕业财一体化,激活企业全面预算管理新动能

智达方通

业财融合 智达方通 全面预算管理 企业财务管理

可拓展的低代码全栈框架

树上有只程序猿

软件开发 低代码

遥遥领先!华为云耀云服务器L实例打造企业数字化转型新标杆

YG科技

技术为王丨华为云打破中小企业开发小程序低效怪圈

轶天下事

时间序列分析在股票量化策略中的探讨

Geek_d872c2

时间序列 量化投资

关系数据库SQL

Frank

sql

Hello, Vector DB|认识一下,这才是真正的向量数据库

Zilliz

Milvus Zilliz ann 向量数据库

跨境电商难做?轻量云服务器助你快速“出海”

YG科技

节能减排 | AIRIOT智慧工厂节能管理解决方案

AIRIOT

物联网 智能工厂

OpenHarmony父子组件双项同步使用:@Link装饰器

OpenHarmony开发者

给力!一个基于SpringBoot+Vue前后端分离低代码项目

互联网工科生

Vue 低代码 springboot

开发搭建体育行业的赛事直播平台指南

软件开发-梦幻运营部

文心一言 VS 讯飞星火 VS chatgpt (109)-- 算法导论10.1 7题

福大大架构师每日一题

福大大架构师每日一题

租赁系统开发定制源码:实现高效、智能的资产管理和租赁流程

V\TG【ch3nguang】

使用 Databend Kafka Connect 构建实时数据同步

Databend

云小课|MRS基础操作之集群健康检查

华为云开发者联盟

大数据 后端 华为云 华为云开发者联盟 华为云云小课

聊聊技术之外的面试问题-上

老张

面试 职业规划 职业发展

八股乱背,力扣不会!下辈子远离计算机

王磊

Java java面试

低代码平台技术分享官丨inBuilder与DevOps平台的集成故事

inBuilder低代码平台

DevOps 低代码

HarmonyOS网络管理开发—Socket连接

HarmonyOS开发者

2023年被问了100遍的1000道java面试题,终于总结成了485页PDF

程序员万金游

编程 Java 面试 程序员、 java Java 面试题

手敲,Ascend算子开发入门笔记分享

华为云开发者联盟

人工智能 华为云 算子开发 华为云开发者联盟 自定义算子

打造次世代分析型数据库(五):复杂查询分析工具

腾讯云大数据

数据库

API网关是什么?

RestCloud

ipaas

JD云云主机太捞?这款轻量云服务器存在感满满

轶天下事

Parallels Desktop 19 for Mac虚拟机 19.0.0一键激活版+完整安装教程

mac

苹果mac Windows软件 Parallels Desktop 19 pd19虚拟机

全域Serverless+AI,华为云加速大模型应用开发

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 大模型应用开发

测试小白必掌握软件测试十大原则

优测云服务平台

软件测试 测试技术 软件测试工具 软件测试技能 测试能力

TX云服务器续费肉痛?试试华为云耀云服务器吧!

轶天下事

C++移动和获取文件读写指针

梦笔生花

Spring扩展-自定义属性编辑器

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