千星項目.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順利誕生。在實施的過程中,驚喜無數吐槽無數。我覺得有必要寫篇文章記錄一下。

本文並不是諸如《.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權限工作流框架  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM