.NET6.0 API仓储+工作单元

.NET6.0 API仓储+工作单元

配置数据库

  1. 引入依赖包
    不同的数据库引入不同:

    • 公共依赖包:

        Microsoft.EntityFrameworkCore
        Microsoft.EntityFrameworkCore.Design
        Microsoft.EntityFrameworkCore.Tools
      
    • SqlServer:

        Microsoft.EntityFrameworkCore.SqlServer
      
    • Sqlite:

        Microsoft.EntityFrameworkCore.Sqlite
      
    • MySql:

        Pomelo.EntityFrameworkCore.MySql
      
  2. 配置连接字符串
    appsettings.json在这里插入代码片文件中加如下代码

{
  "ConnectionStrings": {
  	//sqlite
    "ToDoConnection": "Data Source=to.db" 
    //sqlserver
    "StudentDBConnection": "server=SKY-20161118TNS\\MYSQL2012;Initial Catalog=StudentDB;User ID=sa;Password=123456"  
    //mysql
    "DBConnection": "Server=195.168.1.21;Port=3306;Database=amicauniqidserver;Uid=root;Pwd=123456;"  
  },
  //mysql同时需要配置版本号
  "Custom": {
	  "mysqlVer": "8.0.28-mysql"
	}
}	
Program.cs代码配置
  // 配置数据库,sqlite数据库
builder.Services.AddDbContext<MyToDoContext>(option =>
    {
        var connectionStr = builder.Configuration.GetConnectionString("ToDoConnection");
        option.UseSqlite(connectionStr, b =>
        {
            b.MigrationsAssembly("MyToDoApi");
        });
    })

//配置数据库,sqlserver连接池

//加载sqlserver,采用数据库连接池
 var connectionStr = builder.Configuration.GetConnectionString("ToDoConnection");
builder.services.AddDbContextPool<AppDbContext>(option => 
{
	option.UseSqlServer(connectionStr);
})

//配置数据库,mysql工厂

//加载mysql,采用数据库连接工厂
var connection = host.Configuration.GetConnectionString("DBConnection");
//获取自定义配置参数(mysql版本号)
Config custom = host.Configuration.GetSection("Custom").Get<Config>();
services.AddDbContextFactory<AppDbContext>(
       optionsAction: options => options.UseMySql(connection, new MySqlServerVersion(custom.mysqlVer))
   );

配置工作单元

  1. 引入依赖包
    Microsoft.EntityFrameworkCore.UnitOfWork
  2. 自定义Context类
using Microsoft.EntityFrameworkCore;

public class MyDbContext : DbContext
{
    public MyDbContext (DbContextOptions<MyDbContext> optios) : base(optios)
    {

    }

	//以下为数据库表映射实体类的集合
    public DbSet<UserDto> UserDtos { get; set; }
    public DbSet<ToDoDto> ToDoDtos { get; set; }
    public DbSet<MemoDto> MemoDtos { get; set; }
}
  1. 配置依赖注入
builder.Services.AddUnitOfWork<MyDbContext>();

构建仓储

  1. 分解构建三个实体类的仓储类
using Arch.EntityFrameworkCore.UnitOfWork;

//继承的Repository类来自UnitOfWork包
public class MemoRepository : Repository<MemoDto>
{
    public MemoRepository(MyToDoContext dbContext) : base(dbContext)
    {
         
    }
}

public class ToDoDtoRepository : Repository<ToDoDto>
{
    public ToDoDtoRepository(MyToDoContext dbContext) : base(dbContext)
    {
    }
}

public class UserDtoRepository : Repository<UserDto>
{
    public UserDtoRepository(MyToDoContext dbContext) : base(dbContext)
    {
    }
}
  1. 配置依赖注入
//数据库实体类映射各自仓储类
builder.Services
	.AddCustomRepository<ToDoDto, ToDoDtoRepository>()
	.AddCustomRepository<MemoDto, MemoRepository>()
	.AddCustomRepository<UserDto, UserDtoRepository>();

服务层调用

  1. 创建统一返回类
public class ApiResponse
{
    public ApiResponse(string message, bool status = false)
    {
        this.Message = message;
        this.Status = status;
    }

    public ApiResponse(bool status, object result)
    {
        this.Status = status;
        this.Result = result;
    }

    public string Message {  get; set; }

    public bool Status {  get; set; }

    public object Result {  get; set; }
}
  1. 创建基础服务接口
//定义服务必备函数
public interface IBaseService<T>
{
	//获取全部
    Task<ApiResponse> GetAllAsync();
	//获取指定Id
    Task<ApiResponse> GetSingleAsync(int id);
	//添加记录
    Task<ApiResponse> AddAsync(T model);
    //更新
    Task<ApiResponse> UpdateAsync(T model);
    //删除指定Id
    Task<ApiResponse> DeleteAsync(int id);

}

//分别创建各仓库对应服务接口
//如下例
public interface IToDoDtoService : IBaseService<ToDoDto>
{
}
  1. 创建各仓储服务类
public class ToDoDtoService : IToDoDtoService
{
	//通过工作单元保证混合仓储操作时是统一的DbContext
    private readonly IUnitOfWork _unitOfWork;

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

    public async Task<ApiResponse> AddAsync(ToDoDto model)
    {
        try
        {
            await _unitOfWork.GetRepository<ToDoDto>().InsertAsync(model);
            if (await _unitOfWork.SaveChangesAsync() > 0)
                return new ApiResponse(true, model);

            return new ApiResponse("添加数据失败");
        }
        catch (Exception ex)
        {
            return new ApiResponse(ex.Message);
        }
    }

    public async Task<ApiResponse> DeleteAsync(int id)
    {
        try
        {
        	//通过工作单元对象(_unitOfWork)获取仓储
            var repository = _unitOfWork.GetRepository<ToDoDto>();
            var todo = await repository.GetFirstOrDefaultAsync(predicate: t => t.Id == id);

            repository.Delete(todo);

            if (await _unitOfWork.SaveChangesAsync() > 0)
                return new ApiResponse(true, "");

            return new ApiResponse("删除数据失败");
        }
        catch (Exception ex)
        {
            return new ApiResponse(ex.Message);
        }
    }

    public async Task<ApiResponse> GetAllAsync()
    {
        try
        {
            var repository = _unitOfWork.GetRepository<ToDoDto>();
            var todos = repository.GetAll();

            return new ApiResponse(true, todos);
        }
        catch (Exception ex)
        {
            return new ApiResponse(ex.Message);
        }
    }

    public async Task<ApiResponse> GetSingleAsync(int id)
    {
        try
        {
            var repository = _unitOfWork.GetRepository<ToDoDto>();
            var todo = await repository.GetFirstOrDefaultAsync(predicate: t => t.Id == id);

            return new ApiResponse(true, todo);
        }
        catch (Exception ex)
        {
            return new ApiResponse(ex.Message);
        }
    }

    public async Task<ApiResponse> UpdateAsync(ToDoDto model)
    {
        try
        {
            var repository = _unitOfWork.GetRepository<ToDoDto>();
            var todo = await repository.GetFirstOrDefaultAsync(predicate: t => t.Id == model.Id);

            todo.Title = model.Title;
            todo.UpdateDate = DateTime.Now;
            todo.Status = model.Status;
            todo.Content = model.Content;
            repository.Update(todo);

            if (await _unitOfWork.SaveChangesAsync() > 0)
                return new ApiResponse(true, todo);

            return new ApiResponse("更新数据失败");
        }
        catch (Exception ex)
        {
            return new ApiResponse(ex.Message);
        }
    }

    public ApiResponse GetAll()
    {
        try
        {
            var repository = _unitOfWork.GetRepository<ToDoDto>();
            var todos = repository.GetAll();

            return new ApiResponse(true, todos);
        }
        catch (Exception ex)
        {
            return new ApiResponse(ex.Message);
        }
    }
}

Controllers中调用服务

例:

[Route("api/[controller]/[action]")]
[ApiController]
public class ToDoDtoController : ControllerBase
{
    private readonly IToDoDtoService _toDoDtoService;
    public ToDoDtoController(IToDoDtoService toDoDtoService)
    {
        _toDoDtoService = toDoDtoService;
    }

    [HttpGet]
    public async Task<ApiResponse> Get(int id) => await _toDoDtoService.GetSingleAsync(id);

    [HttpGet]
    public async Task<ApiResponse> GetAll() => await _toDoDtoService.GetAllAsync();

    [HttpPost]
    public async Task<ApiResponse> Add([FromBody] ToDoDto param) => await _toDoDtoService.AddAsync(param);

    [HttpPost]
    public async Task<ApiResponse> Update([FromBody] ToDoDto param)=>await _toDoDtoService.UpdateAsync(param);

    [HttpDelete]
    public async Task<ApiResponse> Delete(int id) => await _toDoDtoService.DeleteAsync(id);
}
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个.NET 6.0 + Element + Vue2的框架搭建步骤: 1. 首先安装.NET 6.0,可以从官网下载安装包并按照提示进行安装。 2. 创建一个新的.NET 6.0 Web项目,可以选择ASP.NET Core Web Application模板并选择API模板。 3. 在项目中安装Vue.js和Element UI,可以使用npm包管理器或者yarn进行安装。 ``` npm install vue npm install element-ui ``` 4. 在项目中创建一个Vue组件,并在组件中引入Element UI的组件,例如: ```vue <template> <div> <el-button @click="showDialog">打开对话框</el-button> <el-dialog :visible.sync="dialogVisible"> <span>这是一个对话框</span> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="dialogVisible = false">确 定</el-button> </span> </el-dialog> </div> </template> <script> import { ElButton, ElDialog } from 'element-ui'; export default { components: { ElButton, ElDialog, }, data() { return { dialogVisible: false, }; }, methods: { showDialog() { this.dialogVisible = true; }, }, }; </script> ``` 5. 在.NET项目中添加对Vue组件的路由支持,例如: ```csharp app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapFallbackToFile("index.html"); }); ``` 6. 最后在.NET项目中创建一个HTML页面并引入Vue组件,例如: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>My App</title> </head> <body> <div id="app"></div> <script src="~/js/app.js"></script> </body> </html> ``` 7. 运行.NET项目并在浏览器中查看页面,应该可以看到一个包含Element UI组件的页面。 希望这个步骤能够帮助你快速搭建一个.NET 6.0 + Element + Vue2的框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值