遷移、上手core,最開始的門檻就是打開解決方案后打得不一樣了,我是從網上下載的一個項目源碼,但應該都是差不多的
主要區別在web層,后端都差不多
一、MVC
framework 4.0的項目(目前公司常用的)
1、Controller和Views一一對應,這個都一樣,雖然叫MVC,但M(Model)文件夾在UI層基本不用,要用實體習慣都在數據層去創建,這樣UI層和數據層都可以用到
2、Web.Config,主要配置connectionStrings連接字符串,還有一定自定義的appSettings屬性
3、Global.asax(具體代碼在Global.asax.cs)
主要是初始化一些注冊項,像路由、過濾器等,並有全局報錯記錄日志
4、Content
放置靜態文件,如JS、CSS、圖片等
5、App_Start
BundleConfig.cs:壓縮合並JS、CSS,不用再用工具去壓縮了,MVC就有提供這功能,在生產環境參數開啟即可
FilterConfig.cs:過濾器,可處理一些日志、報錯
RouteConfig:路由規則,一般默認
WebAPIAuthorizeAttribute、WebApiConfig、WebAPIExceptionAttribute: 看名稱就知道是權限、配置、異常處理等。API可以和MVC混建在一起,用不同控制器區分即可。MVC繼承Controller,API繼承ApiController,當然都會封裝一個BaseController、ApiBaseController進行一些屬性的控制,如權限驗證、日志、異常處理等。
二、.net Core
1、雖然還有Web.Config,但不再是用於日常的配置了,僅僅是為了和IIS對接
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="C:\Program Files\dotnet\dotnet.exe" arguments="watch run" stdoutLogEnabled="true" stdoutLogFile=".\Log\" /> </system.webServer> </location> </configuration>
這個之前寫了,主要是dotnet watch run,像JRebel一樣,無需手動編譯就能后台編譯並在瀏覽器上體現出修改后的結果(實際上是dotnet先停止再生成,自動幫我們編譯了,速度很快,不會像F5那樣要初始化半天才能打開,而且仍停留在當前頁上,還能下斷點)。
2、Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); //添加區域支持 app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:exists}/{controller=Home}/{action=Index}/{id?}" ); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
主要在Configure里,支持對開發環境和生產環境分別載入不同的配置項,比如異常頁面,開發環境上報出具體錯誤,生產上是友好的異常頁。
framework也有,公司目前用的是Web.Config里的一個IsFiterException的選項去控制,再在公共的地方判斷,core更方便了些
另外RouteConfig的路由配置也整合進來了
3、Program.cs
public class Program { public static void Main(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true) .Build(); WebHost.CreateDefaultBuilder(args) .UseConfiguration(config) .UseStartup<Startup>() .Build().Run(); } }
【對於ASP.NET Core應用程序來說,我們要記住非常重要的一點是:其本質上是一個獨立的控制台應用,它並不是必需在IIS內部托管且並不需要IIS來啟動運行(而這正是ASP.NET Core跨平台的基石)。ASP.NET Core應用程序擁有一個內置的Self-Hosted(自托管)的Web Server(Web服務器),用來處理外部請求。】
既然是控制台,那這個Program.cs的Main就是主入口,默認沒有.AddJsonFile("appsettings.json")這項的,如果需要載入自定義的一些配置(如之前說的自定義運行端口,不用默認的5000),可在這里配置
4、bundleconfig.json
即原先的BundleConfig.cs,換成了json,更便於跨平台吧
5、appsettings.json
主要就是可以配置自定義端口,命名成urls即可,叫成其它的認不到:{"urls": "http://localhost:95;"}
6、Pages
看着和framework的Views/Shared一樣,不知是默認就是這樣還是我下載的這個源碼是這樣命名的,反正是一些公用的cshtml
7、wwwroot
即原先的Content,換成wwwroot更直觀
8、Properties / launchSettings.json
有些類似於原先的Web.Config了
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iis": {
"applicationUrl": "http://localhost:95/",
"launchUrl": "http://localhost:95/",
"sslPort": 0
},
"iisExpress": {
"applicationUrl": "http://localhost:54065/",
"sslPort": 0
}
},
"profiles": {
"Development": {
"commandName": "IIS",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:95/",
"launchUrl": "http://localhost:95/"
}
}
}
在項目上右鍵,屬性,里面的【調試】項即本配置
9、依賴項
原先要依賴一堆dll的,現在不知是這項目整合還是core就更簡潔,看不到一堆系統內部的引用了,有用到第三方控件時引用即可。
這項目里好像也有引用一些第三方的,怎么在這里也沒看到。而且網上說有個Project.json,是像Maven一樣定義了要引用的控件,但我沒看到,可能封裝隱藏在其它地方,有碰到再看下
================
自從微軟做了一個艱難的決定——.NET Core徹底放棄project.json,全面改回.csproj
哦原來又整合進csproj了。。。
如果項目里是這樣:
<ItemGroup> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.2" /> <PackageReference Include="AutoMapper" Version="6.2.2" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.4" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="2.4.0" /> </ItemGroup>
這么整理一下,自已心里也有底了,希望也能幫到路過的朋友,對core上手不再恐懼,熟悉了結構很快就恢復原先的開發體驗了。