生态养殖网站模板,网站建设留言板实验心得,广州城乡建设局,个人网站建设报告概述基础设施层是整个系统的⽀持层#xff0c;通过对第三⽅类库的调⽤或系统的抽象和集成来实现对其他层的⽀持。与传统架构不同在DDD中#xff0c;数据库访问的具体实现#xff08;仓储#xff09;也被放在了基础设施层。在DDD的理念中#xff0c;基础设施层是为领域和用… 概述基础设施层是整个系统的⽀持层通过对第三⽅类库的调⽤或系统的抽象和集成来实现对其他层的⽀持。与传统架构不同在DDD中数据库访问的具体实现仓储也被放在了基础设施层。在DDD的理念中基础设施层是为领域和用例的逻辑实现提供支撑。在前面的章节我也提到在DDD的理念中数据访问具体实现不是设计过程需要关注的重点所以将具体访问数据库的代码放在了基础设施层。概览通常情况下我们会将提供数据服务连接的相关类和方法存放于一个项目中而将其他公共类公共方法存放于另外的一个或多个项目中。这些自定义的公共类库这里我就不具体讲述请依据个人项目需要来进行规划设计。基础设施层数据库连接服务主要包含以下组件仓储Repository实现对领域层定义的仓储接口的实现类用户封装对领域对象的数据持久化操作的具体实现。在ABP框架下基础设施层提供数据库访问的类库包含应用程序的数据库上下文DbContext、数据库映射、仓储的实现等信息。依据项目需要我们可以通过CLI中的 -d 参数来选择使用EF Core或者MongoDB分别会包含以下两个类库EntityFrameworkCore是EF Core的基本集成包支持SQL Server、MySQL、SQLite、Oracle、PostgreSQL数据库。默认使用SQL Server数据库。MongoDB以MongoDB为数据库的基础设施层类库。实现细节1默认仓储ABP提供了用于实体增删改查的默认仓储接口和实现类在大多数情况下我们只需要直接注入使用默认仓储 IRepositoryTEntity, TKey 即可其中TEntity为需要操作的实体TKey为该实体主键的数据类型。使用默认仓储时需要在EntityFrameworkCore项目的Module类中的 ConfigureServices 方法中加入以下代码用于给所有实体创建默认仓储context.Services.AddAbpDbContextMyDbContext(options {options.AddDefaultRepositories(includeAllEntities: true);});其中MyDbContext为当前项目的数据上下文includeAllEntities参数为true时会给所有实体、聚合根创建默认仓储如果为false则只给聚合根创建默认仓储。在默认仓储中ABP提供了以下方法可供直接操作数据库GetAsync通过lambda 表达式查询单个实体如果存在多个满足条件的实体则抛出 InvalidOperationException 异常。FindAsync通过lambda 表达式查询单个实体如果存在多个满足条件的实体则抛出 InvalidOperationException 异常。InsertAsync添加实体。InsertManyAsync批量添加。UpdateAsync更新实体。UpdateManyAsync批量修改。DeleteAsync删除实体也可根据Lambda表达式删除。DeleteManyAsync批量删除。GetListAsync获取数据库中所有实体的列表。GetPagedListAsync分页获取实体集合。GetCountAsync获取数据库中所有实体的计数。GetAsync方法和FindAsync方法的区别为如果实体未找到GetAsync抛出 EntityNotFoundException 异常而FindAsync方法返回 null 另外在很多情况下我们希望获取 IQueryable 类型用于自定义Linq查询在ABP 5.0版本之后获取IQueryable方式改为 await _personRepository.GetQueryableAsync(); 2自定义仓储如果默认仓储不能满足我们的需求我们可以自定义仓储接口和实现。自定义仓储接口声明存放与领域层可继承自 IRepositoryTEntity,TKey 其实现类存放与基础设施层继承自 EfCoreRepositoryTDbContext,TEntity,TKey 或 MongoDbRepositoryTDbContext, TEntity, TKey 3Dapper集成在一些情况下我们希望可以使用自定义的SQL语句进行更灵活的数据库操作或者执行存储过程调用等操作而Dapper框架可以满足我们需求。在ABPDapper框架并被没有完整的集成而是依托于EF Core实现。也就意味着如果要使用Dapper创建项目时数据访问对象依旧选择EF Core。当使用Dapper时我们需要创建自定义仓储并将其实现类继承自 DapperRepositoryTDbContext 其中TDbContext为EF Core项目的数据上下文。具体用法我们可以参考官方提供的示例public class PersonDapperRepository : DapperRepositoryMyAppDbContext, ITransientDependency
{public PersonDapperRepository(IDbContextProviderMyAppDbContext dbContextProvider): base(dbContextProvider){}public virtual async TaskListstring GetAllPersonNames(){var dbConnection await GetDbConnectionAsync();return (await dbConnection.QueryAsyncstring(select Name from People, transaction: await GetDbTransactionAsync())).ToList();}public virtual async Taskint UpdatePersonNames(string name){var dbConnection await GetDbConnectionAsync();return await dbConnection.ExecuteAsync(update People set Name NewName, new { NewName name },await GetDbTransactionAsync());}
}欢迎加入微信交流群END关注我获得更多精彩