使用F#开发ASP.NET Core应用程序
.NET Core 里的F#
在.NET Core刚发布时,就已经添加了对F#的支持。但因为当时F#组件还不完整,而一些依赖包并没有放在Nuget上,而是社区自己放到MyGet上,所以在使用dotnet new -l fs创建F#模板时需要在项目中自己添加NuGet.config文件以配置依赖包才能还原成功。
不过在1.0.1发布后改善了F#的模板,通过dotnet new创建F#项目已经不需要自己添加NuGet配置了。
使用dotnet new -l fs生成一个控制台应用程序:

在ASP.NET Core中使用F#
在使用dotnet new创建的C#项目中,可以选择web项目。但F#却只有Console和Lib类型,没有web类型!

既然没有,那我们就将C#的web项目翻译成F#的项目。原始项目为用VS 2015创建的不包含验证的ASP.NET Core项目。
修改project.json文件
通过F#项目的project.json文件,我们可以发现需要修改以下几个地方。
dependencies节点增加F#的核心组件:
"Microsoft.FSharp.Core.netcore": "1.0.0-*"
在tools节点增加F#的编译工具:
"dotnet-compile-fsc": "1.0.0-*"
现在这些都还处于预览版的阶段,希望到时正式版时会提供F#的Web模板。
F#有一个比较麻烦的地方就是编译是按文件顺序的,如果在Visual Studio中,可以方便的在解决方案管理窗口里进行文件顺序变更。但在.NET Core项目中,则需要在project.json中指定。
在buildOptions节点中,增加compilerName为fsc,添加compile节点,用includeFiles指定所有需要编译的文件,最后的buildOptions节点如下:
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true,
"compilerName": "fsc",
"compile": {
"includeFiles": [
"Controllers/HomeControllers.fs",
"Startup.fs",
"Program.fs"
]
}
},
想了解project.json文件的作用,可以查看"project.json reference"。也可以参考博客园里的文章《project.json 这葫芦里卖的什么药》。
源代码
修改完project.json文件,接下来将几个c#文件翻译成F#即可。这就不细说了,直接把代码贴上了。
Controllers/HomeControllers.fs
type HomeController() =
inherit Controller()
member this.Index() = this.View()
member this.About() =
this.ViewData.["Message"] <- "Your application description page."
this.View()
member this.Contact() =
this.ViewData.["Message"] <- "Your contact page.";
this.View()
member this.Error() = this.View()
Startup.fs
type Startup(env: IHostingEnvironment) =
let builder = ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile((sprintf "appsettings.%s.json" env.EnvironmentName), true)
.AddEnvironmentVariables();
let configuration = builder.Build();
member this.ConfigureServices(services: IServiceCollection) =
services.AddMvc() |> ignore
member this.Configure(app:IApplicationBuilder, env:IHostingEnvironment,loggerFactory: ILoggerFactory) =
loggerFactory
.AddConsole(configuration.GetSection("Logging"))
.AddDebug()
|> ignore
if env.IsDevelopment() then
app.UseDeveloperExceptionPage()
.UseBrowserLink()
|> ignore
else
app.UseExceptionHandler("/Home/Error") |> ignore
app.UseStaticFiles() |> ignore
app.UseMvc(fun routes -> routes.MapRoute("default","{controller=Home}/{action=Index}/{id?}") |> ignore)
|>ignore
Program.fs
[<EntryPoint>]
let main argv =
let host = WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build()
host.Run()
0
完整的代码在此:https://github.com/lhysrc/fs-aspnetcore-demo,有兴趣的同学可以下载试试。
记得如果添加了F#源代码文件,需要将文件路径添加到project.json - buildOptions - includeFiles中。
结语
虽然可以用,但现在用F#进行ASP.NET Core的开发体验还不是很好。但只要.NET Core支持F#,相信这些工具方面的应该很快就会跟上。
当我把这个demo传上github,我发现其实已经有F#的ASP.NET Core模板了。
原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ... 使用 dotnet watch 开发 ASP.NET Core 应用程序 原文:Developing ASP.NET Core applications using dotnet watch作者:Vi ... 最新教程:http://www.cnblogs.com/linezero/p/VSCodeASPNETCore.html 使用VS Code开发ASP.NET Core 应用程序 准备 1.安装VS ... 本文结构 ASP.NET Core应用程序的构建 ASP.NET Core应用程序容器化所需注意的问题 应用程序的配置信息 端口侦听 ASP.NET Core的容器版本 docker镜像构建上下文(B ... 1.使用VS Code开发ASP.NET Core WebAPI应用程序 1.使用Visual Studio Code开发Asp.Net Core基础入门实战 毕竟从.net过度过来的我们已经习惯了使 ... vs2015 已经支持开发asp .net core 1.0 rc2 程序了 http://mp.weixin.qq.com/s?__biz=MzI0MzM1ODczOQ==&mid=2247 ... .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ... Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ... 看了几篇大牛写的关于Linux部署ASP.NET Core程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大家伙元旦快乐.不扯淡,直接进入正题.您有任何问题请在评论区留言. 1.环境 ... 异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 一般都是启动一下CUP虚拟化就可以了 比如华硕的: 前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ... ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ... pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ... 昨天,成功搭建了自己的 Maven 环境(详见:Maven(一)环境搭建),今天就来研究和探讨下 Nexus 的搭建! 使用背景: 安装环境:Windows 10 -64位 JDK版本:1.7 Mav ... 一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ... 打开终端, 用cd命令 定位到工程所在的目录,然后调用以下命名即可把每个源代码文件行数及总数统计出来: find . "(" -name "*.m" -or - ... .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ... MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记 说明 以root账户登录Linux操作系统,注意:本文中的所有命令行前面的 #> 表示命令行提示符 ... 从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作为一个学了多年通信的人,ProtocolBuffer在我看来是一种信源编码.所谓信 ...使用F#开发ASP.NET Core应用程序的更多相关文章
随机推荐