游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

AbpVNext分表分库ShardingCore

  ShardingCore易用、简单、高性能、普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2的所有版本,支持efcore2的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款组件,如果你喜欢这组件或者这个组件对你有帮助请点击下发star让更多的。neter可以看到使用
  GiteeStar助力dotnet生态GithubStar背景
  你是否在使用efcore,你是否在使用abp,你是否对目前的分表十分厌恶,手动指定表让你的代码无辜多出很多胶水代码,那么这次的文章可以很好的帮你解决掉当前的困难点,shardingcore针对efcore的分库分表读写分离的痛点进行扩展,可以完美集成到efcore生态的系统里面,无论你是abp还是其他使用efcore的框架,你确定真的不看一下吗,如何集成abp当时我发布这个库的时候就有很多人问我是否支持,我的回答是支持的,只是个人没有时间去实现。这次已经实现了我这边将分享下如何集成shardingcore到abpvnext中。
  距离上一篇博客已经两周了,在这两周期间本人还是做了很多事情,针对优化shardingcore的使用和体验,就在上周五傍晚的时候有个使用abp的同学联系我,问我什么时候支持abpvnext,其实这个计划我很早之前就在issue里面备注了,只是获取用abp的同学没有怎么关注这个类库也没人提出来,所以就搁置了。因为shardingcore是一款几乎可以说可以集成到任何efcore生态下的所以原则上abp上集成应该是没什么难度的,因为本人使用abp不是很多所以这边自己按官方教程进行了初步的项目搭建,然后又用了一会功夫了解了abp源码(之前有了解过)清楚了dbcontext的创建过程所以很快就继承好了一个todoapp
  接下来我将用一篇博客的篇幅来介绍如何将sharingcore集成到abpvnext中。如何集成abp项目创建下载
  我这边是通过github进行了例子的todoapp进行下载,下载后是一个集合例子,我们获取TodoApp项目进行单独处理,打开然后编译。
  注意如果你自己会新建那么也是一样的集成abp思路用过abp的用户都应该知道abp的dbcontext没有什么不一样,唯一需要注意的就是abp:只要你的dbcontext继承至publicclassTDbContext:AbpDbContext那么就可以完美使用。
  但是shardingcore的使用我们通过readme来查看发现sharidngcore:只要你的dbcontext继承至publicclassTDbContext:AbstractShardingDbContext那么你就可以完美使用。
  好家伙直接给想自己集成的同学搞蒙蔽了,c又不是c艹没有多继承啊那怎么办,但是这边其实是有一个误区的就是abp确实需要继承abpdbcontext但是shardingcore是已接口作为依赖来开发的,所以我们只需要实现ISharingDbContext这个接口就可以了如果需要事务在实现ISupportShardingTransaction
  最终我们是通过实现一个抽象基类来继承abpdbcntext并且实现shardingcore需要的接口AbstractShardingAbpDbContext这样我们就可以在不破坏abp的同时又兼顾了shardingcore
  注意:这边sharingcore让你们继承AbstractShardingDbContext是因为重复写这些接口的实现会很麻烦所以给你们写了一个抽象方便你们使用
  abp集成注意事项通过源码可以看出abp集成需要赋值lazyserviceprovider因为abp的dbcontext是交由uow自己处理并且需要支持很多特性所以我们在创建dbcontext的时候需要对此处进行赋值注意点。注意abp默认提供了IEntity,IHasCreationTime属性较为常用所以我们需要注意如何支持这两种,因为当你用id取模分表或者创建时间分表的使用场景还是比较常见的所以我们需要支持。
  因为在insert时如果shardingcore发现对应的分表字段为null就无法继续执行下去,所以为了兼容abp需要支持两个比较常见的需求赋值依赖注入支持domainevent等事件
  自动属性
  了解sahrdingcore针对dbcontext的分表支持
  首先我们需要知道shardingcore是如何对一个普通的dbcontext进行支持的
  如果你的dbcontext有用到以下任意一个接口那么集成起来可能需要自己去实现对应的接口IDbSetSource用来接管dbsetIQueryCompiler用来接管查询编译IDbContextTransactionManager用来接管事务开启IRelationalTransactionFactory用来接管事务的提交、回滚和加入IModelCacheKeyFactory用来接管dbcontext的模型缓存IModelCustomizer用来接管dbcontext的模型初始化前后自定义
  如果你的efcore想接入shardingcore并且如果你没有对dbcontext的上述任何接口进行替换那么可以很容易就接入,如果你的efcore在创建的时候有针对上述的接口进行替换,就需要你自己手动进行两边的实现合并。如何接入shardingcore
  这边我们假设你没有对上述的dbcontextoptionbuilder的创建进行接口的替换那么你只需要进行如下操作就可以简单接入shardingcore首先就是默认创建dbcontext替换为shardingcore的配置
  原先:publicvoidConfigureServices(IServiceCollectionservices)services。AddDbContextDefaultShardingTableDbContext(oo。UseSqlServer(Server。;DatabaseTodoApp;TrustedConnectionTrue));
  现在:publicvoidConfigureServices(IServiceCollectionservices)1。先检查dbcontext构造函数只允许DbContextOptionsTodoAppDbContextoptionsShardingCoreHelper。CheckContextConstructorsDefaultShardingTableDbContext();2。添加UseShardingDefaultShardingTableDbContext()让依赖注入创建的dbcontext支持查询插入事务的管理services。AddDbContextDefaultShardingTableDbContext(oo。UseSqlServer(Server。;DatabaseTodoApp;TrustedConnectionTrue)。UseShardingDefaultShardingTableDbContext());3。添加分表配置newShardingCoreConfigBuilderDefaultShardingTableDbContext(context。Services,((s,builder){builder。UseSqlServer(s);}))。Begin(o{o。CreateShardingTableOnStartfalse;o。EnsureCreatedWithOutShardingTablefalse;o。AutoTrackEntitytrue;})。AddShardingTransaction((connection,builder)builder。UseSqlServer(connection))。AddDefaultDataSource(ds0,Server。;DatabaseTodoApp;TrustedConnectionTrue)。AddShardingTableRoute(o{o。AddShardingTableRouteToDoItemVirtualTableRoute();})。End();publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv)4。初始化分表配置varshardingBootstrapperapp。ApplicationServices。GetRequiredServiceIShardingBootstrapper();shardingBootstrapper。Start();
  综上所述我们接入任何efcore的系统只需要进行4步(第一步都可以去掉只需要3步)就可以完美接入了,可以保证使用abp正式接入替换
  修改将todoitem表作为id取模来进行分表演示修改TodoItem实体
  默认TodoApp有一个TodoItem实体对象我们首先创建两个空接口标识对应分表对像的i分表字段是id,是自动创建的guidpublicinterfaceIShardingKeyIsGuId{}标识对应的分表对应的分表字段是创建时间publicinterfaceIShardingKeyIsCreationTime{}修改TodoItempublicclassTodoItem:BasicAggregateRootGuid,IShardingTable,IShardingKeyIsGuId{〔ShardingTableKey〕publicoverrideGuidId{get;protectedset;}publicstringText{get;set;}}
  创建TodoItem的分表路由
  通过继承默认分表取模路由AbstractSimpleShardingModKeyStringVirtualTableRouteid取模虽然是string但是guid也是一样的最多两位就是0099,按5来取模publicclassToDoItemVirtualTableRoute:AbstractSimpleShardingModKeyStringVirtualTableRouteTodoItem{publicToDoItemVirtualTableRoute():base(2,5){}}实现抽象类修改TodoItemDbContext
  实现AbstractShardingAbpDbContextpublicclassTodoAppDbContext:AbstractShardingAbpDbContextTodoAppDbContext,IIdentityDbContext,ITenantManagementDbContext,IShardingTableDbContext修改实体TodoItempublicclassTodoItem:BasicAggregateRootGuid,IShardingTable,IShardingKeyIsGuId{〔ShardingTableKey〕publicoverrideGuidId{get;protectedset;}publicstringText{get;set;}}
  其中别的接口都和shardingcore一致,为了支持abp的部分自动属性这边进行了新的接口添加用来标识当前的对象是通过什么方式来进行分表的,然后可以高效的通过接口来进行赋值,比如IShardingKeyIsGuId告诉系统是id为guid的进行分表的publicabstractclassAbstractShardingAbpDbContextTDbContext。。。{。。。。。。privatevoidCheckAndSetShardingKeyThatSupportAutoCreateTEntity(TEntityentity)whereTEntity:class{if(entityisIShardingKeyIsGuId){if(entityisIEntityGuidguidEntity){if(guidEntity。Id!default){return;}varidPropertyentity。GetProperty(nameof(IEntityGuid。Id));vardbGeneratedAttrReflectionHelper。GetSingleAttributeOrDefaultDatabaseGeneratedAttribute(idProperty);if(dbGeneratedAttr!nulldbGeneratedAttr。DatabaseGeneratedOption!DatabaseGeneratedOption。None){return;}EntityHelper。TrySetId(guidEntity,()GuidGenerator。Create(),true);}}elseif(entityisIShardingKeyIsCreationTime){AuditPropertySetter?。SetCreationProperties(entity);}}}添加虚拟路由
  既然你讲TodoItem进行了分表,那么你这边需要告诉系统你是按怎么个规则进行分表的,假设我们默认按id取模那么可以继承shardingcore默认提供的取模路由publicclassToDoItemVirtualTableRoute:AbstractSimpleShardingModKeyStringVirtualTableRouteTodoItem{publicToDoItemVirtualTableRoute():base(2,5){}}
  简单说明就是分表后缀为2位数0099,5代表模5也就是00,01,02,03,04
  注意:IShardingTableDbContext如果dbcontext需要实现分表功能必须实现IShardingTableDbContext
  到目前为止我们的准备工作已经完成了,接下来需要进行codefirst的支持和具体项目的配置使用了
  选中TodoApp。EntityFrameworkCore项目打开TodoAppDbContextFactory替换dbcontext的创建方法,主要是替换codefirst的建表语句
  这边是采用了EFCore。ShardingstaticTodoAppDbContextFactory(){varservicesnewServiceCollection();varconfigurationBuildConfiguration();services。AddShardingDbContextTodoAppDbContext((conn,o)o。UseSqlServer(conn)。ReplaceServiceIMigrationsSqlGenerator,ShardingSqlServerMigrationsSqlGeneratorTodoAppDbContext())。Begin(o{o。AutoTrackEntitytrue;})。AddShardingTransaction((connection,builder)builder。UseSqlServer(connection))。AddDefaultDataSource(ds0,configuration。GetConnectionString(Default))。AddShardingTableRoute(o{o。AddShardingTableRouteToDoItemVirtualTableRoute();})。End();services。AddLogging();varbuildServiceProviderservices。BuildServiceProvider();ShardingContainer。SetServices(buildServiceProvider);newShardingBootstrapper(buildServiceProvider)。Start();}publicTodoAppDbContextCreateDbContext(string〔〕args){returnShardingContainer。GetServiceTodoAppDbContext();}
  主要代码就是告诉efcore。tools如何创建对应的dbcontext
  然后打开nuget控制台
  选中需要生成迁移的项目
  启动项设置为
  执行命令PMAddMigrationInitTodoApp
  PMupdatedatabase
  到此为止我们的codefirst已经完成了,系统会自动根据分表的配置来进行创建对应的sql语句abp启动
  因为shardingcore是基于接口和dbcontext所以只要你的efcore那么基本上你的生态就可以接入shardingcore,主要就是注意1点自定义替换DbContextOptions的部分服务dbcontext的构造函数是DbContextOptions或者是他的泛型类修改TodoAppEntityFrameworkCoreModulepublicoverridevoidConfigureServices(ServiceConfigurationContextcontext){。。。。。。Configure(options{ThemainpointtochangeyourDBMS。SeealsoTodoAppDbContextFactoryforEFCoretooling。options。UseSqlServer();options。ConfigureTodoAppDbContext(context1{context1。DbContextOptions。UseSqlServer(Server。;DatabaseTodoApp;TrustedConnectionTrue)。UseShardingTodoAppDbContext();});});ShardingCoreHelper。CheckContextConstructorsTodoAppDbContext();newShardingCoreConfigBuilderTodoAppDbContext(context。Services,((s,builder){builder。UseSqlServer(s);}))。Begin(o{o。CreateShardingTableOnStartfalse;o。EnsureCreatedWithOutShardingTablefalse;o。AutoTrackEntitytrue;})。AddShardingTransaction((connection,builder)builder。UseSqlServer(connection))。AddDefaultDataSource(ds0,Server。;DatabaseTodoApp;TrustedConnectionTrue)。AddShardingTableRoute(o{o。AddShardingTableRouteToDoItemVirtualTableRoute();})。End();}publicoverridevoidOnPostApplicationInitialization(ApplicationInitializationContextcontext){context。ServiceProvider。GetRequiredServiceIShardingBootstrapper()。Start();}
  稍微解释下options。ConfigureTodoAppDbContext(context1{context1。DbContextOptions。UseSqlServer(Server。;DatabaseTodoApp;TrustedConnectionTrue)。UseShardingTodoAppDbContext();});
  用来告诉abp,TodoAppDbContext的创建需要使用useSharding,
  之后就是shardingcore默认提供的builder,当然你们可以自行封装一下,别忘了在启动的时候context。ServiceProvider。GetRequiredServiceIShardingBootstrapper()。Start();
  这个千万不能忘运行TodoApp。Web
  通过添加efcore的日志我们可以清晰地看到abp能够正确的将对应的数据插入进去,并且完全不需要修改现有代码,基本上的零基础使用,简单的配置,
  如果您喜欢本库就点点star点点赞,来都来了点个推荐不过分吧。为。net生态做一份贡献,希望各位个多多提issue,和pr十分感激

困境中的华为,奔跑中的小米昨天两份智能手机出货量和市场占有率的榜单,引起了全网热议。第一个是知名市场机构Canalys给出的国内市场智能手机出货量和年度增长率的榜单,根据榜单内容,华为在三季度的出……健康与情绪的教学反思如今老师家长都比较偏重学生的智力培养,在情绪情感方面上重视得不够。在平日里我也经常发现有些学生在游戏或者学习活动中出现情绪失控,他们不能够及时做好自我调节。由于学生们在不同情绪……人教版高一年级诗两首教案教学目标知识与技能:指导学生把握诗文基调,有表情朗读诗文,培养学生鉴赏诗歌的能力。过程和方法:自主、合作、探究的学习方式。道德、情感、价值观:体验人间至爱亲情……骁龙888Plus跑分曝光单核多核性能大涨小米MIX4将于8月10日正式发布。作为下半年小米的旗舰新品,最新的骁龙888Plus芯片也将随之展现性能,毕竟MIX4是这款芯片的首发机型。近日,微博博主数码闲聊站曝光……蝴蝶花教学反思这是一篇很有意义的童话故事。课文通过浅显通俗的语言揭示了不要骄傲,要有自信,相信自己、他人,每人都拥有一份独特的美丽。的道理。以下是为大家整理的蝴蝶花教学反思,希望对你们有所帮……表层怎么造句1。有些养料位于土壤表层,比如磷,那么我们就需要较浅的根。2。脚垫表层是超强聚酯纤维,强韧耐用,耐磨,使用寿命长。3。本品含有很多的硅酮成份,能使家具表层亮光、溜光……了解寓言文学体裁特点的教案教学目标1、分角色朗读,体会文中动物们富有表现力的语言、动作。2、把握寓言以小见大、含意深刻的特点。说明:这个单元所选录的都是寓言故事,本篇故事生动形象……美术教案小小名片设计师活动名称:艺术领域美术小小名片设计师设计意图:美术绘画《小小名片设计师》以游戏的形式深受孩子的喜欢,非常富有时代气息,用自制的名片认识新朋友,属于社会范畴,运用现代……飞向蓝天的恐龙教案教学目标:1学会生学新词;2初步感知一支恐龙演化成鸟类的过程;3能正确、流利地朗读课文;教学准备:1教师准备课件:恐龙图片和小鸟图片。辽西地区发现……南非,教案示例南非【重点】1。重要的地理位置2。主要的矿产资源【难点】经济特点【教具】南非教学课件(导入)由于长期的殖民统治,造成撒哈拉以南的非洲……第四册第一课音乐教案第一课春天来了教学内容:聆听:1、《嘀哩嘀哩》2、《春晓》表演:1、《大树妈妈》2、《郊游》编创与活动教学目的:1。通过聆听《嘀哩嘀哩》、《春晓》,演唱《大树妈妈》、《郊游》表……初中语文说课稿亲爱的爸爸妈妈说课稿重点说清为什么要这样教,教师要在吃透教材、简析教材内容、教学目的、教学重点、难点的基础上,遵循整体构思、融为一体、综合论述的原则,分块写清,分步阐述教学内容,以进一步提高……
散步第二课时教案《散步》,散文,莫怀戚著,写于1985年。因为是发一种生命的感慨,所以注定了它的抒情,因我不善诗作,它就成了散文。分享了散步第二课时的教案给大家,欢迎借鉴!教学目标……蛹变成了什么的教学反思《蛹变成了什么》一课的教学目标是认识蚕蛾是蚕的成虫,分雌蛾和雄蛾。雌蛾和雄蛾交配后,雌蛾产卵繁殖后代。指导学生观察和描述蚕茧发生的变化和蚕蛾的形态、行为。在观察比较中认识昆虫的……人生是一场静悄悄的储蓄阅读答案【原文】人生是一场静悄悄的储蓄梁阁亭他从小就是一个内向的乖孩子,安静、听话、不爱玩,喜欢一个人坐着,翻看连环画,一坐就是老半天。5岁时,父亲问他想要什么生日礼……高考专题13小说阅读专题13:小说阅读【XX高考考纲解读】阅读鉴赏中外文学作品。了解小说等文学体裁的基本特征及主要表现手法。阅读文学作品注重审美体验。感受形象,品味语言,领悟内涵,分析……走投无路反义词是什么瀑布是江河走投无路时创造的奇迹。下面是小编收集整理的走投无路反义词,希望对你有所帮助!【反义词】:左右逢源、如愿以偿、天从人愿、鹏程万里造句:1、在警方……幼儿园大班滚动教案活动目标:1运用身体各部位的协调尝试在地面做横躺滚。2利用绸带的合作性游戏,从多种角度发展幼儿创新技能。3培养合作互助的精神。4锻炼幼儿坚持到底的意志,……育儿心得在幼儿园经验交流本上的一段话孩子是我们的希望,他(她)们的成长是我们所有人的关注焦点。作为家长我希望给孩子一个快乐的童年,身心健康、快乐长大。育儿经验谈不上,只是在淇淇成长过程中的一些观点和做法与各位家长……有关撺掇的造句1、他们撺掇别人到牙医生那儿去。2、只要有人撺掇一起找乐子,就千万不要错过。3、他一再撺掇我学习滑冰!4、我的。姐姐,归省回来,她告诉我她去九寨沟度假,那里的……明湖居听书说课稿推荐初中语文教学大纲要求我们语文教育工作者引导学生接受优秀文化的熏陶,进一步提高阅读能力和写作能力。我选择了《明湖居听书》,希望能够贴近二期课改的要求。一、学情分析我所……搭石说课稿范文今天,我上的《搭石》一课,是人教版第七册教材中的课文。我想从以下几个方面来说:一、我的设计理念是:在教学过程中,我让每个学生能过精心读书,获得个性体验和独特感受;为……孩子,我在等你犯错阅读训练题及答案孩子,我在等你犯错孙道荣我问儿子,今天偷看电视了吗?暑假,我们规定,你白天不许看电视。你却故zu轻松地回答说:没有哇。我盯着你,又严肃地问:真的没看吗?你要诚……飞舞的同义词近义词是什么【飞舞解释】:像跳舞似地在空中飞:雪花蝴蝶在花丛中。下面品学网小编就给大家整理飞舞的同义词,近义词和造句,供大家学习参考。飞舞的同义词和近义词飞翔航行飞行飞舞……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网