首页 > 其他分享 >Entity Framework Core 中使用仓库和工作单元事务,服务层和控制器

Entity Framework Core 中使用仓库和工作单元事务,服务层和控制器

时间:2024-10-13 13:48:52浏览次数:6  
标签:Core product Task await public Framework async Entity id

  1. 定义实体
    首先定义一个实体,例如 Product:

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
CopyInsert
2. 创建 DbContext
创建一个 DbContext 类:

public class AppDbContext : DbContext
{
public DbSet Products { get; set; }

public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

}
CopyInsert
3. 定义仓库接口和实现
定义一个通用仓库接口:

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);
}
CopyInsert
实现该接口:

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

public Repository(AppDbContext 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);
    _dbSet.Remove(entity);
}

}
CopyInsert
4. 定义工作单元接口和实现
定义工作单元接口:

public interface IUnitOfWork
{
Task SaveChangesAsync();
}
CopyInsert
实现工作单元:

public class UnitOfWork : IUnitOfWork
{
private readonly AppDbContext _context;

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

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

}
CopyInsert
5. 创建服务层
创建服务层来处理业务逻辑:

public interface IProductService
{
Task<IEnumerable> GetAllProductsAsync();
Task GetProductByIdAsync(int id);
Task AddProductAsync(Product product);
Task UpdateProductAsync(Product product);
Task DeleteProductAsync(int id);
}

public class ProductService : IProductService
{
private readonly IRepository _productRepository;
private readonly IUnitOfWork _unitOfWork;

public ProductService(IRepository<Product> productRepository, IUnitOfWork unitOfWork)
{
    _productRepository = productRepository;
    _unitOfWork = unitOfWork;
}

public async Task<IEnumerable<Product>> GetAllProductsAsync() => await _productRepository.GetAllAsync();

public async Task<Product> GetProductByIdAsync(int id) => await _productRepository.GetByIdAsync(id);

public async Task AddProductAsync(Product product)
{
    await _productRepository.AddAsync(product);
    await _unitOfWork.SaveChangesAsync();
}

public async Task UpdateProductAsync(Product product)
{
    await _productRepository.UpdateAsync(product);
    await _unitOfWork.SaveChangesAsync();
}

public async Task DeleteProductAsync(int id)
{
    await _productRepository.DeleteAsync(id);
    await _unitOfWork.SaveChangesAsync();
}

}
CopyInsert
6. 创建控制器
最后,创建一个控制器来处理 HTTP 请求:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductService _productService;

public ProductsController(IProductService productService)
{
    _productService = productService;
}

[HttpGet]
public async Task<IActionResult> GetAll() => Ok(await _productService.GetAllProductsAsync());

[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id) => Ok(await _productService.GetProductByIdAsync(id));

[HttpPost]
public async Task<IActionResult> Create(Product product)
{
    await _productService.AddProductAsync(product);
    return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
}

[HttpPut("{id}")]
public async Task<IActionResult> Update(int id, Product product)
{
    if (id != product.Id)
    {
        return BadRequest();
    }
    await _productService.UpdateProductAsync(product);
    return NoContent();
}

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

}
CopyInsert
7. 在 Startup.cs 中配置服务
最后,在 Startup.cs(或 Program.cs)中配置服务:

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddScoped<IProductService, ProductService>();

services.AddControllers();

}
CopyInsert
通过以上步骤,你将可以在 ASP.NET Core 应用程序中实现一个基本的仓库和工作单元模式,以及服务层和控制器的分离。这样有助于保持代码的清晰和可维护性。

标签:Core,product,Task,await,public,Framework,async,Entity,id
From: https://www.cnblogs.com/zy8899/p/18462209

相关文章

  • 使用Entity Framework Core(EF Core)进行开发时,结合仓库模式和工作单元模式,服务层以及控
    仓储(Repository)仓储模式封装对数据源的访问逻辑,包括CRUD操作。以下是一个简单的仓储接口和实现示例:publicinterfaceIRepositorywhereT:class{Task<IEnumerable>GetAllAsync();TaskGetByIdAsync(intid);TaskAddAsync(Tentity);TaskUpdateAsync(Tentity);Tas......
  • NETCORE - 日志插件 Microsoft.Extensions.Logging
    NETCORE-日志插件Microsoft.Extensions.Loggingnetcore的默认日志插件为 Microsoft.Extensions.Logging,已集成在框架中。使用样例:namespaceRailGraph.Controllers{[ApiController][Route("[controller]")]publicclassANeo4jController:ControllerBas......
  • scheduler framework扩展点
    k8sv1.25.0扩展点作用queueSort待调度队列pod排序preFilter预选前预处理filter预选postFilter预选后处理(可修改pod为可调度)preScore预打分score优选reserve资源预留给podpermit阻止或延迟pod绑定......
  • .NET Core Options
    .NETCore中,使用Options模式来读取配置信息。Options模式是配置绑定的一个强类型方式,通过IOptions<T>,IOptionsSnapshot<T>和IOptionsMonitor<T>三种不同的方式来管理应用程序的配置数据。1.使用IOptions<T>IOptions<T>是最简单的选项,用于读取配置数据。它在应用程......
  • NetCore 阿里云表格存储插入数据实例
    十年河东,十年河西,莫欺少年穷学无止境,精益求精帮助类:publicclassOtsHelper{publicstaticstringEndpoint="https://xxx.cn-shanghai.ots.aliyuncs.com";publicstaticstringInstanceName="xxx";///<summary>//......
  • VS Code安装C#开发工具包并编写ASP.NET Core Web应用
    前言    前段时间微软发布了适用于VSCode的C#开发工具包(注意目前该包还属于预发布状态但是可以正常使用),因为之前看过网上的一些使用VSCode搭建.NETCore环境的教程看着还挺复杂的就一直没有尝试使用VSCode来编写.NETCore。不过听说C#开发工具包提供了一系列功能和扩展,从而......
  • Visual Studio Code调试和发布ASP.NET Core Web应用
    前言上一篇文章主要讲了VisualStudioCode安装C#开发工具包并编写ASP.NETCoreWeb应用有兴趣的同学可以去看看,今天咱们主要是要讲讲如何在VSCode中调试和发布ASP.NETCoreWeb应用。VisualStudioCode安装C#开发工具包并编写ASP.NETCoreWeb应用配置launch.json文件launch.jso......
  • crit: Microsoft.AspNetCore.Server.Kestrel[0] Unable to start Kestrel. Interop+Cr
    域名证书没有放在指定的位置错误信息crit:Microsoft.AspNetCore.Server.Kestrel[0]UnabletostartKestrel.Interop+Crypto+OpenSslCryptographicException:error:2006D080:BIOroutines:BIO_new_file:nosuchfileatInterop.Crypto.CheckValidOpenSslHandle(Saf......
  • visual studio 2022 安装net旧版本(net framework4.0和4.5)
    原文链接:visualstudio2022安装net旧版本(netframework4.0和4.5)_vs20224.0框架问题:VisualStudio2022安装程序中单个组件中没有.netframework4.0或者.netframework4.5的问题,NETSDK下载 Download.NETSDKsforVisualStudio下载没有4.5和4.0的开发包其他Net版本直......
  • C#/.NET/.NET Core优秀项目和框架2024年9月简报
    前言公众号每月定期推广和分享的C#/.NET/.NETCore优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码......