代码改变世界

千星项目.Net Core 2.1移植填坑记--OpenAuth.Core诞生

2018-06-10 16:02 by 李玉宝, ... 阅读, ... 评论, 收藏, 编辑

 背景

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