很早就有把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
在asp.net mcv中咱们能够在任意位置经过HttpContext.Current这个静态成员获取到一次http请求的上下文信息,进而获取到Request,Response。但asp.net core中已经没有这个静态成员了,为何去掉?多好用啊?由于它是静态的啊,静态是反面向对象的啊。那如今获取它容易吗?固然,经过IHttpContextAccessor:sql
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; } }
在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...想一想,多方便😀
.net core 2.1直接使用csproj项目文件来管理第三方包,而不是之前.NET 4.5使用的packages.config方式。熟悉JAVA Maven的小伙伴应该不会以为陌生,很是相似pom文件,即管理工程又管理第三方的引用。在VS中若是直接如下图文本的方式修改保存后,VS检测到文件被修改,自动会添加新增的包或卸载相应的包,操做很是方便,这是一个习惯Maven方式的小伙伴最渴望的功能😭😭
最后说下在项目移植的过程当中,最坑爹的一个问题:
若是你新建一个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权限工做流框架