背景
很早就有把OpenAuth.Net----最好用的.net權限管理工作流框架(好吧!我在吹牛😂)移植到.net core的想法,但一直沒有實施。前段時間.net core 2.1發布,我覺得時機應該到了,經過最近幾天的折騰,順利的把一個.net 4.5+ef 6.0環境轉換為.net core 2.1 + ef core,OpenAuth.Core順利誕生。在實施的過程中,驚喜無數吐槽無數。我覺得有必要寫篇文章記錄一下。
本文並不是諸如《.net core 入門系列之新建....》《.net core項目實戰系列(1).....》等介紹step by step。因為我覺得完全沒有必要。asp.net core mvc與asp.net mvc在應用層面的開發體驗區別並不是很大,一個擁有多年.net開發經驗的人完全沒必要再去走新建一個Hello world的道路,完全可以新建一個asp.net core應用項目,然后把原來.net 4.5的工程代碼文件扔進來,修修改改即可。本文介紹在我移植過程中 ,讓我無限吐槽(大部分是讓我無限驚喜)的地方,以及某些疑問的最優解決方案!
無處不在的注入
是的,無處不在的注入!
把這個放在第一位,是因為我覺得這是微軟做了多年的孽,時至今日才開眼了。一個用asp.net mvc六七年的人不一定知道依賴注入,但只要用J2EE spring mvc幾個月的開發者必定會形成依賴注入的意識,而這個意識是面向對象SOLID原則中依賴倒置的基石。這樣直接導致了.NET開發者普遍比JAVA開發者晚幾年接觸到這個概念,再怎么強調它的重要性都不為過。spring mvc從一開始都強制用注入的方式來完成代碼的編寫,隨處可見的@Service @Repository,而在使用asp.net mvc時,開發者的關注點會被框架強行帶到Razor語法、模型綁定這些問題上,雖然框架也提供了dependency injection,但並不能引起新手的注意。而現在,asp.net core mvc也帶來了萬物皆注入的思想。關於注入的具體用法,園子里很多大神都介紹過,我就不多說了。比如騰飛兄的:全面理解 ASP.NET Core 依賴注入。
消失了的HttpContext.Current
在asp.net mcv中我們可以在任意位置通過HttpContext.Current這個靜態成員獲取到一次http請求的上下文信息,進而獲取到Request,Response。但asp.net core中已經沒有這個靜態成員了,為什么去掉?多好用啊?因為它是靜態的啊,靜態是反面向對象的啊。那現在獲取它容易嗎?當然,通過IHttpContextAccessor:
public class HomeController { private IHttpContextAccessor _httpContextAccessor; public HomeController(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } [HttpGet] public string GetToken() { var cookie = _httpContextAccessor.HttpContext.Request.Cookies["Token"]; return cookie == null ? String.Empty : cookie; } }
消失了的緩存HttpRuntime.Cache
在asp.net mcv中我們可以在任意位置通過HttpRuntime.Cache這個靜態成員獲取緩存信息。但asp.net core中已經沒有這個靜態成員了,為什么去掉?多好用啊?因為它是靜態的啊,靜態是反面向對象的啊。那現在獲取它容易嗎?當然,通過IMemoryCache:
public class HomeController { private IMemoryCache _objCache; public HomeController(IMemoryCache objCache) { _objCache = objCache; } [HttpGet] public string Get(string key) { return _objCache.Get<string>(key); } }
全新的配置文件
asp.net core把配置方式從web.config修改為appsettings.json。
當然,在asp.net mcv中我們可以在任意位置通過ConfigurationManager.AppSettings這個靜態成員獲取配置。但asp.net core中已經沒有這個靜態成員了,為什么去掉?多好用啊?因為它是靜態的啊,靜態是反面向對象的啊。那現在獲取它容易嗎?當然,通過IOptions:
public class HomeController { private IOptions<AppSetting> _appConfiguration; public HomeController(IOptions<AppSetting> appConfiguration) { _appConfiguration = appConfiguration; } [HttpGet] public string GetVersion() { return _appConfiguration.Value.Version; } }
逗?這么多例子只是想說明:無處不在的注入!
controller中那些Ixxxxx接口都沒實例化,而且沒有機會實例化啊??
public class Startup { public void ConfigureServices(IServiceCollection services) { ... services.AddMemoryCache(); //注入緩存 services.AddOptions(); //注入配置 ... } }
只需要在啟動startup中注入相應的服務即可。后期如果想換成Memcache,sqlcache...想想,多方便😀
工程文件csproj
.net core 2.1直接使用csproj項目文件來管理第三方包,而不是以前.NET 4.5使用的packages.config方式。熟悉JAVA Maven的小伙伴應該不會覺得陌生,非常類似pom文件,即管理工程又管理第三方的引用。在VS中如果直接以下圖文本的方式修改保存后,VS檢測到文件被修改,自動會添加新增的包或卸載相應的包,操作非常方便,這是一個習慣Maven方式的小伙伴最渴望的功能😭😭
Cookie
最后說下在項目移植的過程中,最坑爹的一個問題:
如果你新建一個asp.net core mvc項目,然后淡定的寫出下面這句:
Response.Cookies.Append("token","mytokenvalue")
你會發現,無論怎么調客戶端都沒有cookie,折騰數小時后發現了前幾天才頒布的GDPR 《通用數據保護條例》,國際互聯網新規不准隨便記錄cookie。簡單的解決方式是【 options.CheckConsentNeeded = context => false】復雜的可以參考:ASP.NET Core2.1 你不得不了解的GDPR(Cookie處理)
最后
OpenAuth.Core 秉承代碼之美,為.net core添磚加瓦,喜歡的star一下
當然也可以體驗下star 1400+ 的OpenAuth.Net----最好用的.net權限工作流框架