![ae5eae60abca035a0d6b673f6af0c046.png](https://i-blog.csdnimg.cn/blog_migrate/b5467aa1adbb9261bf15834bc3287b4a.jpeg)
1、前提说明:
1、源码参考
本文大部分代码参照 https://www.cnblogs.com/royzshare/p/9522127.html以及其源码 https://github.com/zdz72113/NETCore_BasicKnowledge.Examples结合分层经验。原文使用的是Net Core 2.1
2、分层依赖
参考:https://www.cnblogs.com/Leo_wl/p/4343242.html。其中给出多种分层结构,选择适合自己的方式。
2、搭建解决方案
![c79585c24b68601946da8ddaca4173ef.png](https://i-blog.csdnimg.cn/blog_migrate/1bc2f1ac663400b5b2c6a64de5f99bae.jpeg)
一、解决方案依赖的包
Install-Package MySql.Data 8.0.19 Install-Package Dapper 2.0.30 Install-Package Dapper.Contrib 2.0.30 Install-Package Microsoft.Extensions.Options 3.1.1
二、领域层
![6b9300b0549234dc9cb5a0fd6b7e6149.png](https://i-blog.csdnimg.cn/blog_migrate/26e7dad3a9a6ebd9fc33051e7b4a7bc3.jpeg)
1、实体接口,领域模型中所有实体对象继承
public interface IEntity { public string Id { get; } }
2、聚合根接口,聚合实体继承此接口
public interface IAggregateRoot : IEntity { }
3、包括领域事件,领域服务,和值对象等(省略)
4、示例:产品分类实体和产品实体
[Table("Category")]public class Category:IAggregateRoot{ public int Id { get; set; } public string Name { get; set; }}[Table("Product")]public class Product:IAggregateRoot{ [Key] public int Id { get; set; } public string Name { get; set; } public int Quantity { get; set; } public decimal Price { get; set; } public int CategoryId { get; set; } public virtual Category Category { get; set; }}
三、仓储层
1、仓储泛型接口,泛型参数接口 约束-聚合根
public interface IRepository where TAggregateRoot : class, IAggregateRoot{ Task AddAsync(TAggregateRoot entity); Task> GetAllAsync(); Task GetByIDAsync(int id); Task DeleteAsync(int id); Task UpdateAsync(TAggregateRoot entity);}
2、示例:定义产品分类和产品仓储接口
public interface ICategoryRepository : IRepository { }public interface IProductRepository : IRepository { }
3、上下文IContext
提供对象列表的一切操作接口。在基础层去实现操作。示例:DapperDBContext
public interface IContext : IDisposable{ bool IsTransactionStarted { get; } void BeginTransaction(); void Commit(); void Rollback();}
4、工作单元IUnitOfWork
统一工作单元,维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决
public interface IUnitOfWork : IDisposable{ void SaveChanges();}
定义工作单元工厂,创建工厂实例实现工作单元,关联对象操作上下文。
public interface IUnitOfWorkFactory{ IUnitOfWork Create();}
四、基础层
1、实现IContext实例DapperDBContext和Dapper操作扩展Execute&Query
public abstract class DapperDBContext : IContext{ private IDbConnection _connection; private IDbTransaction _transaction; private int? _commandTimeout = null; private readonly DapperDBContextOptions _options; public bool IsTransactionStarted { get; private set; } protected abs