你在你的 .NET Core API 项目中犯过这个错误吗?

数据模型是任何 .NET Core API 服务器的支柱。

至少,这是我的经验。

建立在数据模型上的是 API 控制器,让全世界都可以访问你的数据。

我经常看到的一个常见错误是 .NET API 服务器项目对每个数据模型重复 CRUD 操作。换句话说,每个数据模型都有 CRUD 函数。每次将新数据模型添加到项目时,你都必须创建一个新控制器并从头开始编写 CRUD 端点。

为什么这是一个错误?

因为它会向你的 .NET Core 应用程序添加重复代码。而且因为任何值得一试的开发人员都知道,代码行数越少越好。

那么,为你拥有的每个数据模型创建一个带有 CRUD(创建、读取、更新、删除)功能的基本控制器不是很聪明吗?

根据项目的大小,你可以为自己节省数千行代码。
在这里插入图片描述

并成为你开发团队的英雄?🤩

今天,我将为你提供有关如何为你的数据模型创建 CRUD 控制器的完整指南。在不违反 DRY 原则的情况下。🥳

是的,伙计,在你的 .NET Core API 应用程序中使用基本控制器会让你大放异彩。而且并不复杂。事实上,这很容易做到,令人印象深刻。

那么,我们如何为 .NET Core 项目中的每个数据模型创建一个 CRUD 控制器?

使用 .NET Core 创建演示 API 服务器
对于这篇文章,我将使用.NET CLI创建一个演示项目。

dotnet new webapi -o BaseController

这将生成一个基本的 API 服务器,其中包含一个名为WeatherForecastController.cs.

进入下一个重要步骤!

安装和配置 Entity Framework Core
为了让这个演示保持简单,我们将使用InMemory包,它允许我们在内存中启动一个假数据库。下面是我们如何安装它。

dotnet 添加包 Microsoft.EntityFrameworkCore.InMemory –version 3.1.15

接下来,我们将创建我们的数据库上下文。我将下面的代码放在一个名为BaseControllerDBContext.cs

using Microsoft.EntityFrameworkCore;

namespace BaseController
{
    public class BaseControllerDBContext : DbContext
    {
        public DbSet<WeatherForecast> WeatherForecasts { get; set; }
        public BaseControllerDBContext(DbContextOptions<BaseControllerDBContext> options) : base(options)
        {

        }
    }
}

最后,我们需要将我们的数据库上下文添加到Startup.cs文件中。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BaseControllerDBContext>(options => options.UseInMemoryDatabase("BaseController"));
    services.AddControllers();
}

加油!这是一起 lickety-split!🎺

创建数据模型
我们的下一步将是创建一个所有其他数据类都将从其继承的基类。

这是它的样子。

using System;

namespace BaseController
{
    public class BaseModel
    {
        public Guid Id { get; set; }        
    }
} 

为了使示例简单,我只包含了一个Id字段。但是对于其他场景,通常还添加 aCreated和Updated以及你希望所有数据模型包含的任何其他内容。

现在我们需要更新WeatherForecast类以从我们的基本模型继承。

using System;

namespace BaseController
{
    public class WeatherForecast : BaseModel
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string Summary { get; set; }
    }
}

太棒了!我们的数据模型已准备就绪!下一步是创建一个带有 CRUD 操作的基本控制器。

创建基础控制器
我们已经到了秘方。

我的朋友,这就是你开始发光的地方。所以坐起来注意。

在我们的控制器文件夹中,我们将创建一个名为BaseController.cs. 这个 API 控制器将有 5 个不同的 CRUD 函数。

创建记录
获取记录
获取与类型关联的所有记录
删除一条记录
更新记录
这是代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace BaseController.Controllers
{
    [ApiController]
    public class BaseController<TEntity> : ControllerBase where TEntity : BaseModel
    {
        protected readonly BaseControllerDBContext _context;
        protected DbSet<TEntity> _dbSet { get; set; }
        public BaseController(BaseControllerDBContext context) 
        { 
            _context = context;
            _dbSet = _context.Set<TEntity>();
        }

        [HttpGet]
        public virtual async Task<IEnumerable<TEntity>> GetAllAsync()
        {
            return await _dbSet.ToListAsync();
        }

        [HttpGet("{id}")]
        public virtual async Task<TEntity> GetAsync(Guid id)
        {           
            return await _dbSet.Where(e => e.Id == id).FirstOrDefaultAsync();
        }

        [HttpDelete("{id}")]
        public virtual async Task DeleteAsync(Guid id)
        {           
            var entity = await _dbSet.Where(e => e.Id == id).FirstOrDefaultAsync();
            _dbSet.Remove(entity);
            await _context.SaveChangesAsync();
        }

        [HttpPost]
        public virtual async Task<TEntity> CreateAsync(TEntity entity)
        {           
            await _dbSet.AddAsync(entity);
            await _context.SaveChangesAsync();
            return entity;
        }

        [HttpPost]
        public virtual async Task<TEntity> UpdateAsync(TEntity entity)
        {           
            _dbSet.Update(entity);
            await _context.SaveChangesAsync();
            return entity;
        }
    }
}

不错!事情进展很快。我们快完成了!

Extend that controller
现在,我们将获取WeatherForecastController.cs文件并将其更改为继承基本控制器的功能。

这是它需要的样子。

using Microsoft.AspNetCore.Mvc;

namespace BaseController.Controllers
{
    [ApiController]
    [Route("api/weather-forecast")]
    public class WeatherForecastController : BaseController<WeatherForecast>
    {
        public WeatherForecastController(BaseControllerDBContext context) : base(context)
        {

        }
    }
}

BOOM! 💥

你已经为WeatherForecast数据模型创建了一个端点,而无需为该模型重新创建 CRUD 函数。

结论
在本文中,我们发现了如何使用 CRUD 操作创建基本控制器。然后我们使用该基本控制器并使用它为我们的其他数据模型创建 API 端点,而无需重新编码 CRUD 操作。

技术交流Q群: 1012481075 群内有各种流行书籍资料
原文链接:

发表评论

您的电子邮箱地址不会被公开。

WeChat
WeChat
QQ
QQ
返回顶部