0
点赞
收藏
分享

微信扫一扫

VS QT 创建新的QT类后,编译报错无法解析的外部符号 “public: virtual struct QMetaObject const *

白衣蓝剑冰魄 2024-01-16 阅读 8
数据库c#

仓储(Repository)/工作单元(Unit Of Work)模式


一.实现基础的仓储接口

     1. 创建  待办事项仓储接口类 IToDoRepository  并且定义了(ToDo)实体对数据库CURD 的方法 

    public interface IToDoRepository
    {
        Task<bool> Add(ToDo toDo);
        bool Delete(ToDo toDo);
        bool Update(ToDo toDo);
        Task<ToDo> GetToDo();
    }

      2. 创建待办事项仓储的 实现类 ToDoRepository。该类继承自 IToDoRepository 仓储接口,并且需要实现父类所有定义的方法。

public class ToDoRepository : IToDoRepository
{
    private readonly MyToDoContext doContext;

    public ToDoRepository(MyToDoContext doContext)
    {
        this.doContext = doContext;
    }
    /// <summary>
    /// 增加
    /// </summary>
    /// <param name="toDo"></param>
    /// <returns></returns>
    public async Task<bool> Add(ToDo toDo)
    {
         await doContext.ToDo.AddAsync(toDo);
        return await doContext.SaveChangesAsync()>0;
    }

    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="toDo"></param>
    /// <returns></returns>
    public  bool Delete(ToDo toDo)
    {
        doContext.ToDo.Remove(toDo);    
        return  doContext.SaveChanges()>0;
    }

    /// <summary>
    ///  更新
    /// </summary>
    /// <param name="toDo"></param>
    /// <returns></returns>
    public bool Update(ToDo toDo)
    {
        doContext.ToDo.Update(new ToDo
        {
            Id = toDo.Id,
            Title=toDo.Title,
            Content=toDo.Content,
        });
        return  doContext.SaveChanges()>0;
    }
    /// <summary>
    /// 查询
    /// </summary>
    /// <returns></returns>
    public async Task<ToDo> GetToDo()
    {
       var toDo=await doContext.ToDo.FirstOrDefaultAsync();
        return toDo;
    }
}

 二.如何使用仓储

    1. 在 Program.cs 中,进行注入

builder.Services.AddScoped<IToDoRepository,ToDoRepository>();

     2. 在控制器构造函数中实例化定义的仓储接口,并且通过 toDoRepository 实例去调用到定义的方法。

namespace MyToDo.Api.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly IToDoRepository toDoRepository;

        public WeatherForecastController(IToDoRepository toDoRepository)
        {
            this.toDoRepository = toDoRepository;
        }

        [HttpGet(Name = "GetToDo")]
        public async Task<ToDo> Get()
        {
           var  retsult= await toDoRepository.GetToDo();
            return retsult;
        }
        [HttpPost(Name = "Add")]
        public async Task<bool> AddAsync(ToDo toDo)
        {
            var retsult = await toDoRepository.Add(toDo);
            return retsult;
        }
        [HttpDelete(Name = "Delete")]
        public bool Deletes(ToDo toDo)
        {
            var retsult =  toDoRepository.Delete(toDo);
            return retsult;
        }
        [HttpPost(Name = "Update")]
        public bool UpdateAsync(ToDo toDo)
        {
            var retsult = toDoRepository.Update(toDo);
            return retsult;
        }
    }
}


三.工作单元 (Unit Of Work)

 1.  下载 Unit Of Work 源码

 2.在MyToDo.Api 项目中,创建一个 UnitOfWork 文件夹,并且把以下代码复制过来

 3. 创建一个类库项目去存放,共用的代码

4.选择 类库项目,点下一步,并且项目名称定义成 :MyToDo.Shared

5.把共用的代码,复制到 MyToDo.Shared 里面去

6.在MyToDo.Api 项目中,右键=》添加=》项目引用

7.勾选 MyToDo.Shared。表示在 MyToDo.Api引用该项目,点击确定。

8.最后,还需要在MyToDo.Api 项目的NuGet 中下载安装这个包


四.如何使用工作单元 (Unit Of Work)

1. 先添加不同仓储的实现,例如,待办事项仓储 (ToDoRepository) 

    public class ToDoRepository : Repository<ToDo>, IRepository<ToDo>
    {
        public ToDoRepository(MyToDoContext dbContext) : base(dbContext)
        {

        }
    }


2.在Program.cs 中进行依赖注入

builder.Services.AddDbContext<MyToDoContext>(option =>
{
    //获取数据库连接
    var connectionString = builder.Configuration.GetConnectionString("ToDoConnection");
    //使用sqlite
    option.UseSqlite(connectionString);
}).AddUnitOfWork<MyToDoContext>() //注入工作单元
.AddCustomRepository<ToDo,ToDoRepository>() //注入仓储
.AddCustomRepository<Memo, MemoRepository>()
.AddCustomRepository<User, UserRepository>();


 3.使用方式

namespace MyToDo.Api.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly IUnitOfWork unitOfWork;

        public WeatherForecastController(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
        }

        [HttpGet(Name = "GetToDo")]
        public async Task<List<ToDo>> Get()
        {
            var  service= unitOfWork.GetRepository<ToDo>();//获取仓储服务
            return (List<ToDo>)await service.GetAllAsync();
            
        }
    }
}

4.最后效果

举报

相关推荐

0 条评论