.NET Core 分层
实际案例一:
json扩展组件(可并入公共组件文件夹)
对外接口层:采用webapi模式、autofac、autoMap
公共组件层:
日志组件(可并入公共组件文件夹):log4Net
模型层:DTO模型和实体模型
报表组件(可并入对外接口层):采用mvc模式
仓储层: 上下文模型、仓储类、仓储接口、工作单元模式
当前仅继承了Microsoft.EntityFrameworkCore 通用增删改查方法,对小项目来说有些过度设计。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using wms.Model.Entities; namespace wms.Repository { public class CompanyRepository : RepositoryBase<TCompany>, ICompanyRepository { public CompanyRepository(WmsDataContext context) : base(context) { } } }
using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace wms.Repository { public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity : class { public RepositoryBase(WmsDataContext dbContext) { DbContext = dbContext; DbSet = DbContext.Set<TEntity>(); } protected DbContext DbContext { get; } protected DbSet<TEntity> DbSet { get; } /// <summary> /// 添加记录 /// </summary> /// <param name="entity"></param> public void Insert(TEntity entity) { DbSet.Add(entity); } /// <summary> /// 添加记录(批量) /// </summary> /// <param name="entity"></param> public void Insert(IEnumerable<TEntity> entity) { DbSet.AddRange(entity); } /// <summary> /// 更新记录 /// </summary> /// <param name="entity"></param> public void Update(TEntity entity) { DbSet.Update(entity); } /// <summary> /// 更新记录(批量) /// </summary> /// <param name="entity"></param> public void Update(IEnumerable<TEntity> entity) { DbSet.UpdateRange(entity); } /// <summary> /// 删除记录 /// </summary> /// <param name="entity"></param> public void Delete(TEntity entity) { DbSet.Remove(entity); } /// <summary> /// 得到实体查询对象 /// </summary> /// <returns></returns> public IQueryable<TEntity> Query() { return DbSet; } public void Delete(IEnumerable<TEntity> entities) { DbSet.RemoveRange(entities); } } }
服务层:接口类、服务类(数据组装),是对数据库某个或几个表操作的封装。
再复杂点,则需要在细分出:
1领域层:对服务层的封装,可以理解为业务逻辑层,按不同业务拆分出不同部分。
2缓存层:
3仓储层: 数据实体化用不同ORM框架或不同数据库时起作用,使兼容各种ORM框架(EF、ADO、Hibernate(Nhibernate),iBatis,mybatis,EclipseLink,JFinal)和数据库,避免影响其它层。
案例二:https://blog.csdn.net/patriot_28/article/details/108756720
Entity
Entity(实体)包中的类和数据库中的表时一一对应关系,包括字段名称、数据类型。
Model
一般地,Model(模型)存的是实体(Entity)类的模型。为了给前端提供实际使用的数据,一般在Model会对某些字段等进行处理,如表里存的性别字段,gender,保存的是f/m,但是提供给前端的时候需要把f/m替换成女/男。还可以添加新的字段,如把省province、市city、区district、地址address合并成新的字段detailed_address:省+市+区+地址。
Domain
Domain(领域)一般是多个Model的组合,如查看一个订单详情,除了订单编码、商品名称等订单相关的信息,可能还需要把用户信息、发货地址、支付信息等展示出来,这时就可以按Domain返回数据。
Repository
Repository(仓库)主要是针对数据进行操作,包括对不同类型数据库(如mysqsl、redis、mongodb等)中的数据进行整合。业务层应该直接和Repository打交道。
DAO
DAO(DataAccessObject) 数据访问层,直接操作数据库表,进行增删改查等操作。
Data
Data(数据层),用于缓存数据写入和读取、配置参数数据的读取等。
Logic
Logic(逻辑层)主要负责数据校验、业务流程处理等。
Service
Service层主要负责业务模块的逻辑应用设计。作用如下:
封装通用的业务逻辑,操作。如一些数据的检验,可以通用处理。
与数据层的交互。
其他请求:如远程服务获取数据,如第三方api等。
Controller
Controller(控制器)层主要处理外部请求,一般在此层调用Serice层的接口来控制业务流程,根据业务情况返回相关数据。
View
View(视图层)与控制层结合比较紧密,一般地,View主要负责展示应用的前端页面。
Action
同Controller,Java中使用。
POJO
同Entity,Java中使用。