基于EF Core的Code First模式的DotNetCore快速开发框架
前言
最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单。所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code first模式,从而可以进行快速开发。几个单子做完下来,顺便总结整理一下,近些时候也一直在学习dotnetcore,索性将项目都升级了,于是便有了这一套“基于EF Core的Code First模式的DotNetCore快速开发框架”。至于code first模式的优劣,此文将不再赘述。至于本文的目的,一是为了总结和整理工作这几年所学的一些知识,方便以后能够快速高效地接入项目中。再是分享出来,跟大家一起探讨学习,一起进步。欢迎各路大佬指正和建议^_^
项目地址
GitHub:
dotnetcore版本:https://github.com/VictorTzeng/Zxw.Framework.NetCore
.net framework版本:https://github.com/VictorTzeng/Zxw.Framework.Nfx
码云:
dotnetcore版本:https://gitee.com/ceo_bitch/Zxw.Framework.NetCore
.net framework版本:https://gitee.com/ceo_bitch/Zxw.Framework.Nfx
项目架构
此项目主要分成两部分:Zxw.Framework.NetCore (核心类库)和 NetCore.Sample (示例)两部分。如图所示:
Zxw.Framework.NetCore 项目说明:
- Attributes —— 一些常用的属性
- CodeGenerator —— 代码生成器,用于生成Repository和Service层的代码
- CodeTemplate —— Repository和Service层代码模板
- EfDbContext —— EF上下文
- Extensions —— 一些常用的扩展方法
- Filters —— 一些常用的拦截器
- Helpers —— 一些常用的帮助类
- IoC —— IoC容器封装类,Autofac
- IRepositories —— Repository接口类
- IServices —— Service接口类
- Middlewares —— 中间件
- Models —— 实体接口类,IBaseModel<TKey>
- Options —— 一些常用的配置类
- Repositories —— Repository层的父类
- Services —— Service层的父类
框架使用
如 NetCore.Sample 所示,按照此项目结构创建好:
- Zxw.Framework.Website —— 网站
- Zxw.Framework.Website.Controllers —— 控制器
- Zxw.Framework.Website.IRepositories —— 仓储接口
- Zxw.Framework.Website.IServices —— Service接口
- Zxw.Framework.Website.Models —— 实体
- Zxw.Framework.Website.Repositories —— 仓储
- Zxw.Framework.Website.Services —— Services
- Zxw.Framework.Website.ViewModels —— ViewModels
安装nuget package:
Install-Package Zxw.Framework.NetCore -Version 1.0.1
需要注意以下几点:
- 所有实体都需实现IBaseModel<TKey>接口(TKey是主键类型),如果需要在数据库中生成对应的数据表
- 如果IRepositories、IServices、Repositories、Services这四个项目没有单独建立,调用代码生成器生成的代码将存在于调用项目的目录下
- 利用代码生成器生成的代码文件需要手动添加到项目中
实体示例:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Zxw.Framework.NetCore.Models; namespace Zxw.Framework.Website.Models
{
public class TutorClassType:IBaseModel<int>
{
[Key]
[Column("TutorClassTypeId")]
public int Id { get; set; } [Required]
[StringLength(maximumLength:)]
public string TutorClassTypeName { get; set; }
public bool Active { get; set; } = true;
[StringLength(maximumLength:)]
public string Remark { get; set; }
public int TutorClassCount { get; set; }
}
}
在Startup.cs文件中使用:
using System;
using System.Text;
using log4net;
using log4net.Repository;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Zxw.Framework.NetCore.EfDbContext;
using Zxw.Framework.NetCore.Filters;
using Zxw.Framework.NetCore.Helpers;
using Zxw.Framework.NetCore.IoC;
using Zxw.Framework.NetCore.Options; namespace Zxw.Framework.Website
{
public class Startup
{
public static ILoggerRepository repository { get; set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
//初始化log4net
repository = LogManager.CreateRepository("NETCoreRepository");
Log4NetHelper.SetConfig(repository, "log4net.config");
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc(option=>
{
option.Filters.Add(new GlobalExceptionFilter());
});
services.AddMemoryCache();//启用MemoryCache
services.AddDistributedRedisCache(option =>
{
option.Configuration = "localhost";//redis连接字符串
option.InstanceName = "";//Redis实例名称
});//启用Redis
services.Configure<MemoryCacheEntryOptions>(
options => options.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes()) //设置MemoryCache缓存有效时间为5分钟。
.Configure<DistributedCacheEntryOptions>(option =>
option.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes());//设置Redis缓存有效时间为5分钟。
return InitIoC(services);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UseStaticFiles(); app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
/// <summary>
/// IoC初始化
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
private IServiceProvider InitIoC(IServiceCollection services)
{
var connectionString = Configuration.GetConnectionString("MsSqlServer");
var dbContextOption = new DbContextOption
{
ConnectionString = connectionString,
ModelAssemblyName = "Zxw.Framework.Website.Models",
DbType = DbType.MSSQLSERVER
};
var codeGenerateOption = new CodeGenerateOption
{
ModelsNamespace = "Zxw.Framework.Website.Models",
IRepositoriesNamespace = "Zxw.Framework.Website.IRepositories",
RepositoriesNamespace = "Zxw.Framework.Website.Repositories",
IServicsNamespace = "Zxw.Framework.Website.IServices",
ServicesNamespace = "Zxw.Framework.Website.Services"
};
IoCContainer.Register(Configuration);//注册配置
IoCContainer.Register(dbContextOption);//注册数据库配置信息
IoCContainer.Register(codeGenerateOption);//注册代码生成器相关配置信息
IoCContainer.Register(typeof(DefaultDbContext));//注册EF上下文
IoCContainer.Register("Zxw.Framework.Website.Repositories", "Zxw.Framework.Website.IRepositories");//注册仓储
IoCContainer.Register("Zxw.Framework.Website.Services", "Zxw.Framework.Website.IServices");//注册service
return IoCContainer.Build(services);
}
}
}
使用代码生成器:
using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Zxw.Framework.NetCore.CodeGenerator;
using Zxw.Framework.NetCore.Helpers;
using Zxw.Framework.Website.IServices;
using Zxw.Framework.Website.ViewModels;
using Zxw.Framework.Website.Models; namespace Zxw.Framework.Website.Controllers
{
public class HomeController : Controller
{
private ITutorClassTypeService iTutorClassTypeService; public HomeController(ITutorClassTypeService tutorClassTypeService)
{
if(tutorClassTypeService==null)
throw new ArgumentNullException(nameof(tutorClassTypeService));
iTutorClassTypeService = tutorClassTypeService;
}
public IActionResult Index()
{
CodeGenerator.Generate();//生成所有实体类对应的Repository和Service层代码文件
CodeGenerator.GenerateSingle<TutorClassType, int>();//生成单个实体类对应的Repository和Service层代码文件 return View();
} public IActionResult About()
{
ViewData["Message"] = "Your application description page."; return View();
} public IActionResult Contact()
{
ViewData["Message"] = "Your contact page."; return View();
} public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
} protected override void Dispose(bool disposing)
{
if (disposing)
{
iTutorClassTypeService.Dispose();
}
base.Dispose(disposing);
}
}
}
总结
写博客真的很费力,希望自己能够坚持下去。
最后,欢迎各路大佬建议和拍砖~~
基于EF Core的Code First模式的DotNetCore快速开发框架的更多相关文章
- 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持
前言 距离上一篇文章<基于EF Core的Code First模式的DotNetCore快速开发框架>已过去大半个年头,时光荏苒,岁月如梭...比较尴尬的是,在这大半个年头里,除了日常带娃 ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- EF Core 的 Code First 模式
0 前言 本文正文第一节,会对 Code First 进行基本的介绍,以及对相关名词进行说明,读者一开始可以不用在这里消耗过多时间,可以先操作一遍例子,再回过头理解. 第二节,以一个简单的例子,展示 ...
- EF Core学习Code First
下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库. 本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以 ...
- EF Core的Code First 基础
一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...
- .net Core 基于EF Core 实现数据库上下文
在做项目时,需要将某一些功能的实体建立在另一个数据库中,连接不同的数据库用以存储记录.通过查找资料,实现EF Core上下文. 下面是实现上下文后的解决方案的目录: 1.UpAndDownDbCont ...
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...
- 基于现有数据库的Code First模式迁移更新数据库
本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下 ...
- EF 下的code fist 模式编程
EF 分两种模式 codefirst(就是不知道数据是啥,也没有数据库) 和 database fist (数据已经设计好了) 首先打开vs 新建一个项目 创建一个控制台程序 然后 新建一个Tea ...
随机推荐
- 想做iPhoneX抢购活动?压测大师先教你优化网站后台
北京时间9月13日凌晨1点,iPhone 10周年,在Apple Park乔布斯剧院,苹果发布了三款新iPhone.全面屏iPhone X来袭,这款被定义为未来的智能手机黑科技满满:全面屏,无线充电. ...
- C# 委托、匿名方法、lambda简介
在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个First不 ...
- IT经典书籍——Head First系列…
Head First 系列书籍是由 O'Relly 出版社发行的一系列教育书籍,中文一般翻译为"深入浅出",它强调以特殊的方式排版,由大量的图片和有趣的内容组合构成,而达到非疲劳的 ...
- SNS团队第六次站立会议(2017.04.27)
一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 导入相关词库数据 研究如何存取语音.图片文件 龚晓 ...
- 【集美大学1411_助教博客】alpha阶段后 成绩
团队作业7 成绩(助教对团队排名) 团队名称 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 全组讨论的照片 团队成员在Alpha阶段的角色和具体贡献 合计 排 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2st day
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 界面 1.四个用户登录界面已经完成. 2.界面内的功能完成了一小部分. 登陆部分 1.QQ授权已经申请,还未通过. 2.通过好 ...
- Java学习8——类(对象)之间的关系
(基础语法结束,开始看面向对象) 关联 关联体现的是两个类之间语义级别的一种依赖关系,比如我和我的老师. 继承(一般和特殊) 继承是指一个类继承另外一个类的的功能,并可以增加新的功能,"XX ...
- 201521123110 《Java程序设计》第7周学习总结
1. 本章学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { re ...
- 201521123088《Java程序》第二周总结
#1. 本章学习总结 ①java基本数据类型 ②String类对象使用 #2. 书面作业 使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)?分析String使用什么来存储字符 ...
- 201521123005 《Java程序设计》 第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...