背景
很早就有把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权限工作流框架