千星項目.Net Core 2.1移植填坑記--OpenAuth.Core誕生

 背景

很早就有把OpenAuth.Net----最好用的.net權限管理工做流框架(好吧!我在吹牛😂)移植到.net core的想法,但一直沒有實施。前段時間.net core 2.1發佈,我以爲時機應該到了,通過最近幾天的折騰,順利的把一個.net 4.5+ef 6.0環境轉換爲.net core 2.1 + ef core,OpenAuth.Core順利誕生。在實施的過程當中,驚喜無數吐槽無數。我以爲有必要寫篇文章記錄一下。html

本文並非諸如《.net core 入門系列之新建....》《.net core項目實戰系列(1).....》等介紹step by step。由於我以爲徹底沒有必要。asp.net core mvc與asp.net mvc在應用層面的開發體驗區別並非很大,一個擁有多年.net開發經驗的人徹底不必再去走新建一個Hello world的道路,徹底能夠新建一個asp.net core應用項目,而後把原來.net 4.5的工程代碼文件扔進來,修修改改便可。本文介紹在我移植過程當中 ,讓我無限吐槽(大部分是讓我無限驚喜)的地方,以及某些疑問的最優解決方案!git

無處不在的注入

是的,無處不在的注入!web

把這個放在第一位,是由於我以爲這是微軟作了多年的孽,時至今日纔開眼了。一個用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 依賴注入。 spring

消失了的HttpContext.Current

 在asp.net mcv中咱們能夠在任意位置經過HttpContext.Current這個靜態成員獲取到一次http請求的上下文信息,進而獲取到Request,Response。但asp.net core中已經沒有這個靜態成員了,爲何去掉?多好用啊?由於它是靜態的啊,靜態是反面向對象的啊。那如今獲取它容易嗎?固然,經過IHttpContextAccessorsql

    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:json

  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:cookie

public class HomeController
    {
        private IOptions<AppSetting> _appConfiguration;

       public HomeController(IOptions<AppSetting> appConfiguration)
        {
            _appConfiguration = appConfiguration;
        }
        [HttpGet]
        public string GetVersion()
        {
            return _appConfiguration.Value.Version;
        }

    }

逗?這麼多例子只是想說明:無處不在的注入!mvc

controller中那些Ixxxxx接口都沒實例化,並且沒有機會實例化啊??app

 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權限工做流框架  

相關文章
相關標籤/搜索