千星项目.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权限工做流框架  

相关文章
相关标签/搜索