首页 > 其他分享 >使用Entity Framework Core(EF Core)进行开发时,结合仓库模式和工作单元模式,服务层以及控制器,可以实现一个清晰和高效的架构

使用Entity Framework Core(EF Core)进行开发时,结合仓库模式和工作单元模式,服务层以及控制器,可以实现一个清晰和高效的架构

时间:2024-10-13 13:43:16浏览次数:7  
标签:Core Task EF 模式 entity id async public await

  1. 仓储(Repository)
    仓储模式封装对数据源的访问逻辑,包括CRUD操作。以下是一个简单的仓储接口和实现示例:

public interface IRepository where T : class
{
Task<IEnumerable> GetAllAsync();
Task GetByIdAsync(int id);
Task AddAsync(T entity);
Task UpdateAsync(T entity);
Task DeleteAsync(int id);
}

public class Repository : IRepository where T : class
{
private readonly DbContext _context;
private readonly DbSet _dbSet;

public Repository(DbContext context)
{
    _context = context;
    _dbSet = context.Set<T>();
}

public async Task<IEnumerable<T>> GetAllAsync() => await _dbSet.ToListAsync();

public async Task<T> GetByIdAsync(int id) => await _dbSet.FindAsync(id);

public async Task AddAsync(T entity) => await _dbSet.AddAsync(entity);

public async Task UpdateAsync(T entity) => _dbSet.Update(entity);

public async Task DeleteAsync(int id)
{
    var entity = await GetByIdAsync(id);
    if (entity != null)
    {
        _dbSet.Remove(entity);
    }
}

}
CopyInsert
2. 工作单元(Unit of Work)
工作单元职责是协调多个仓储之间的操作,并统一提交事务。以下是一个工作单元的接口和实现示例:

public interface IUnitOfWork : IDisposable
{
IRepository Repository() where TEntity : class;
Task SaveChangesAsync();
}

public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _context;

public UnitOfWork(DbContext context)
{
    _context = context;
}

public IRepository<TEntity> Repository<TEntity>() where TEntity : class
{
    return new Repository<TEntity>(_context);
}

public async Task<int> SaveChangesAsync() => await _context.SaveChangesAsync();

public void Dispose()
{
    _context.Dispose();
}

}
CopyInsert
3. 服务层(Service Layer)
服务层处理业务逻辑,并调用仓储和工作单元。以下是服务层的示例:

public interface IMyService
{
Task<IEnumerable> GetAllEntitiesAsync();
Task GetEntityByIdAsync(int id);
Task AddEntityAsync(MyEntity entity);
Task UpdateEntityAsync(MyEntity entity);
Task DeleteEntityAsync(int id);
}

public class MyService : IMyService
{
private readonly IUnitOfWork _unitOfWork;

public MyService(IUnitOfWork unitOfWork)
{
    _unitOfWork = unitOfWork;
}

public async Task<IEnumerable<MyEntity>> GetAllEntitiesAsync()
{
    return await _unitOfWork.Repository<MyEntity>().GetAllAsync();
}

public async Task<MyEntity> GetEntityByIdAsync(int id)
{
    return await _unitOfWork.Repository<MyEntity>().GetByIdAsync(id);
}

public async Task AddEntityAsync(MyEntity entity)
{
    await _unitOfWork.Repository<MyEntity>().AddAsync(entity);
    await _unitOfWork.SaveChangesAsync();
}

public async Task UpdateEntityAsync(MyEntity entity)
{
    await _unitOfWork.Repository<MyEntity>().UpdateAsync(entity);
    await _unitOfWork.SaveChangesAsync();
}

public async Task DeleteEntityAsync(int id)
{
    await _unitOfWork.Repository<MyEntity>().DeleteAsync(id);
    await _unitOfWork.SaveChangesAsync();
}

}
CopyInsert
4. 控制器(Controller)
控制器接收用户请求并调用服务层。以下是控制器的示例:

[ApiController]
[Route("[controller]")]
public class MyEntityController : ControllerBase
{
private readonly IMyService _myService;

public MyEntityController(IMyService myService)
{
    _myService = myService;
}

[HttpGet]
public async Task<IActionResult> GetAll()
{
    var entities = await _myService.GetAllEntitiesAsync();
    return Ok(entities);
}

[HttpGet("{id}")]
public async Task<IActionResult> Get(int id)
{
    var entity = await _myService.GetEntityByIdAsync(id);
    if (entity == null) return NotFound();
    return Ok(entity);
}

[HttpPost]
public async Task<IActionResult> Post([FromBody] MyEntity entity)
{
    await _myService.AddEntityAsync(entity);
    return CreatedAtAction(nameof(Get), new { id = entity.Id }, entity);
}

[HttpPut("{id}")]
public async Task<IActionResult> Put(int id, [FromBody] MyEntity entity)
{
    if (id != entity.Id) return BadRequest();
    await _myService.UpdateEntityAsync(entity);
    return NoContent();
}

[HttpDelete("{id}")]
public async Task<IActionResult> Delete(int id)
{
    await _myService.DeleteEntityAsync(id);
    return NoContent();
}

}
CopyInsert
总结
通过结合使用仓储、工作单元、服务层和控制器,可以构建一个高内聚、低耦合的分层架构。这种设计有助于增强代码的可读性、可维护性和可扩展性。在实际开发中,可以根据团队和项目的需求进行适当的调整和优化。

标签:Core,Task,EF,模式,entity,id,async,public,await
From: https://www.cnblogs.com/zy8899/p/18462206

相关文章

  • 基于nodejs+vue基于O2O模式的外卖订餐系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,人们的生活方式正经历着深刻的变革。在快节奏的城市生活中,外卖订餐已成为众多消费者解决日常饮食需求的重要方式。传统的餐饮行业......
  • YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点
    YOLOv9分割改进前训练结果:YOLOv9分割改进后训练结果:摘要卷积神经网络(ConvNets)通常在固定的资源预算下开发,然后在有更多资源时进行扩展以提高准确性。在本文中,我们系统地研究了模型扩展,并发现仔细平衡网络深度、宽度和分辨率可以带来更好的性能。基于这一观察,提出......
  • 设计模式(二)
    第一类模式:创建者模式创建型模式的主要关注点是“怎么样创建对象?”,它的主要关注点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为:单例模式工厂方法模式抽象工程模式原型模式建造者......
  • 单例模式
    什么是单例模式保证一个类仅有一个实例,对外提供一个访问方法。为什么要用单例模式资源控制,节省内存,资源共享,延迟初始化,易于维护实现方式饿汉式publicclassSingleton01{privatestaticSingleton01instance=newSingleton01();privateSingleton01(){}......
  • 3-GPIO八大输出模式 推挽输出 与 开漏输出
    推挽输出与开漏输出GPIO有八大输出模式下图为每个GPIO口的基本结构:通过这张图来学习最右侧是I/O引脚,是从STM32引脚到GPIO口的导线,与其他芯片进行连接的线。芯片内部电路所能承受的电压有限,当未知的静电进入GPIO口,大于所能承受的电压,就会被上方的保护二极管导通,将电......
  • 如果在单例模式中返回share_ptr ???
    背景:接触到一个很有意思的题目:如果在单例模式中返回share_ptr???staticstd::shared_ptr<Singleton>getInstance(); 分析:这个问题的难点在于如果要实现单例,那么一定要把构造函数变成私有的,但是make_shared一定是调用的public的函数。破题思路是:把构造函数变成public,但......
  • Codeforces Round 946 (Div. 3)
    E.MoneyBuysHappiness题意:给你\(m\)个月,每个月可以赚\(x\)元,每个月你都有一次机会花费\(c_i\)元,获得\(h_i\)的幸福。(当然你目前得有足够的钱)。求出能够获得的最大幸福值。思路:我们可以求出获得\(i\)幸福值所需的最小花费,然后判断能否有足够的钱即可。考虑如何求解,把......
  • iOS 在OC 中使用 AEC 的 ECB、CTR模式加解密
    实用实测过的代码。 AEC加解密网上一大把,简单列举一下。CTR模式,搜索了好多,试用了好几个都是代码不完全参数不对造成无法正常运行加解密。不同模式引用了不同的系统库路径。 调整加解密,修改参数 operation:kCCDecrypt/ kCCEncryptAECCTR模式解密#import<CommonCryp......
  • 理解嵌入式系统中ARM32架构下的电源管理单元(PMU)及节能模式-原理(上)
     电源管理单元(PowerManagementUnit,PMU)是现代电子设备尤其是嵌入式系统中不可或缺的一部分。PMU的主要任务是管理和分配电力资源,确保各个组件在正确的工作电压下运行,同时优化系统的整体能效。PMU通常包含多种功能模块,如稳压器(LDO或DC-DC转换器)、电池充电电路、电量监测电......
  • linux系统epoll的ET/LT模式-附串口接收代码
    LT模式下,读事件触发后,可以按需收取想要的字节数,不用把本次接收到的数据收取干净(即不用循环到recv或者read函数返回-1,错误码为EWOULDBLOCK或EAGAIN);ET模式下,读事件必须把数据收取干净,因为你不一定有下一次机会再收取数据了,即使有机会,也可能存在上次没读完的数据没有及时......