ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.NET经销商实战(二)——仓储与服务层完善,及扩展linq

2022-05-25 22:35:08  阅读:162  来源: 互联网

标签:TEntity System linq 仓储 var using NET dbset public


1.IRepository如下

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using DealerPlatform.Domain.Models;

namespace DealerPlatform.Core.Repository
{
	public interface IRepository<TEntity> where TEntity : BaseEntity
	{
		DealerPlatformContext Context { get; }

		TEntity Add(TEntity entity);
		Task<TEntity> AddAsync(TEntity entity);
		TEntity Delete(TEntity entity);
		TEntity Get(Func<TEntity, bool> predicate);
		Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> predicate);
		TEntity GetEntityById(int id);
		List<TEntity> GetList();
		List<TEntity> GetList(Func<TEntity, bool> predicate);
		Task<List<TEntity>> GetListAsync();
		Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> predicate);
		TEntity Update(TEntity entity);
		Task<TEntity> UpdateAsync(TEntity entity);
	}
}

2.Repository

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using DealerPlatform.Domain.Models;
using Microsoft.EntityFrameworkCore;

namespace DealerPlatform.Core.Repository
{

	public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
	{
		public Repository(DealerPlatformContext context)
		{
			Context = context;
		}

		public DealerPlatformContext Context { get; }
		/// <summary>
		/// 获取集合
		/// </summary>
		/// <returns></returns>
		public List<TEntity> GetList()
		{
			return Context.Set<TEntity>().ToList();
		}
		public async Task<List<TEntity>> GetListAsync()
		{
			return await Context.Set<TEntity>().ToListAsync();
		}
		//对集合进行筛选
		/// <summary>
		/// 对集合进行筛选   IEnumerable
		/// </summary>
		/// <param name="predicate"></param>
		/// <returns></returns>
		public List<TEntity> GetList(Func<TEntity, bool> predicate)
		{
			var dbset = Context.Set<TEntity>();
			return dbset.Where(predicate).ToList();
		}
		public async Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> predicate)
		{
			var dbset = Context.Set<TEntity>();
			return await dbset.Where(predicate).ToListAsync();
			// return await dbset.WhereAsync(predicate).ToListAsync();
		}
		/// <summary>
		/// 通过id获取当前实体信息
		/// </summary>
		/// <returns></returns>
		public TEntity GetEntityById(int id)
		{
			var data = Context.Set<TEntity>().Where(s => s.Id == id).FirstOrDefault();
			return data;
		}
		public TEntity Get(Func<TEntity, bool> predicate)
		{
			var dbset = Context.Set<TEntity>();
			return dbset.Where(predicate).FirstOrDefault();
		}
		public async Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> predicate)
		{
			var dbset = Context.Set<TEntity>();
			return await dbset.Where(predicate).FirstOrDefaultAsync();
			// return await dbset.WhereAsync(predicate).ToListAsync();
		}
		/// <summary>
		/// 添加方法
		/// </summary>
		/// <param name="entity"></param>
		/// <returns></returns>
		public TEntity Add(TEntity entity)
		{
			var dbset = Context.Set<TEntity>();
			var res = dbset.Add(entity).Entity;
			Context.SaveChanges();
			return res;
		}
		public async Task<TEntity> AddAsync(TEntity entity)
		{
			var dbset = Context.Set<TEntity>();
			var res = (await dbset.AddAsync(entity)).Entity;
			Context.SaveChanges();
			return res;
		}
		/// <summary>
		/// 删除方法
		/// </summary>
		/// <param name="entity"></param>
		/// <returns></returns>
		public TEntity Delete(TEntity entity)
		{
			var dbset = Context.Set<TEntity>();
			var res = dbset.Remove(entity).Entity;
			Context.SaveChanges();
			return res;
		}
		/// <summary>
		/// 修改方法
		/// </summary>
		/// <param name="entity"></param>
		/// <returns></returns>
		public TEntity Update(TEntity entity)
		{
			var dbset = Context.Set<TEntity>();
			var oldData = dbset.Where(s => s.Id == entity.Id).FirstOrDefault();
			if (oldData != null)
			{
				var updateData = dbset.Update(entity).Entity;
				Context.SaveChanges();
				return updateData;
			}
			else
			{
				throw new Exception("当前数据异常!");
			}

		}
		public async Task<TEntity> UpdateAsync(TEntity entity)
		{
			var dbset = Context.Set<TEntity>();
			var oldData = dbset.Where(s => s.Id == entity.Id).FirstOrDefault();
			if (oldData != null)
			{
				var updateData = dbset.Update(entity).Entity;
				Context.SaveChanges();
				return updateData;
			}
			else
			{
				throw new Exception("当前数据异常!");
			}
		}
	}
}

3.在program中注入仓储

点击查看代码
builder.Services.AddTransient(typeof(IRepository<>), typeof(Repository<>));

4.linq扩展

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace DealerPlatform.Core.Repository
{
	public static class LinqExtensions
	{
		/// <summary>
		/// 扩展dbset
		/// </summary>
		/// <param name="dbset"></param>
		/// <param name="predicate"></param>
		/// <typeparam name="TEntity"></typeparam>
		/// <returns></returns>
		public async static IAsyncEnumerable<TEntity> WhereAsync<TEntity>(this DbSet<TEntity> dbset, Func<TEntity, bool> predicate)
		where TEntity : class
		{
			var res = dbset.Where(predicate);
			foreach (var item in res)
			{
				yield return item;
			}
		}
		/// <summary>
		/// 扩展IAsyncEnumerable
		/// </summary>
		/// <param name="listAsync"></param>
		/// <typeparam name="TEntity"></typeparam>
		/// <returns></returns>
		public async static Task<List<TEntity>> ToListAsync<TEntity>(this IAsyncEnumerable<TEntity> listAsync)
		{
			List<TEntity> list = new();
			await foreach (var item in listAsync)
			{
				list.Add(item);
			}
			return list;
		}
	}
}

5.接下来就是写我们的具体的业务了,service结构如下,带I的是接口,其余都是class,自行添加类与接口,整体结构如图

注意:Service里除了接口与dto,其余都是部分类partial,不懂得自行百度,用于共享继承接口及属性和字段的
6.CustomerService代码如下

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DealerPlatform.Core.Repository;
using DealerPlatform.Domain.Models;

namespace DealerPlatform.Service.CustomerApp
{
	/// <summary>
	/// 部分类实现,共享一些字段,方法及属性,部分类中其中有一个继承接口,其他都继承
	/// </summary>
	public partial class CustomerService : ICustomerService
	{
		public CustomerService(
			IRepository<Customer> customerRepo,
			IRepository<CustomerInvoice> customerInvoiceRepo,
			IRepository<CustomerPwd> customerPwdRepo
			)
		{
			CustomerRepo = customerRepo;
			CustomerInvoiceRepo = customerInvoiceRepo;
			CustomerPwdRepo = customerPwdRepo;
		}

		public IRepository<Customer> CustomerRepo { get; }
		public IRepository<CustomerInvoice> CustomerInvoiceRepo { get; }
		public IRepository<CustomerPwd> CustomerPwdRepo { get; }
	}
}

7.Customer.Invoice暂时没有代码,Customer.Pwd代码如下:

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DealerPlatform.Core.Repository;
using DealerPlatform.Domain.Models;
using DealerPlatform.Service.CustomerApp.Dto;

namespace DealerPlatform.Service.CustomerApp
{

	public partial class CustomerService
	{
		public async Task<bool> CheckPassword(CustomerLoginDto dto)
		{
			// if (string.IsNullOrWhiteSpace(dto.CustomerNo) || string.IsNullOrWhiteSpace(dto.Password))
			// {
			// 	throw new Exception("账号或密码不能为空!");
			// }
			//判断当前dto中是否为空
			var res = CustomerPwdRepo.GetAsync(s => s.CustomerNo == dto.CustomerNo && s.CustomerPwd1 == dto.Password);
			if (res != null)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}
}

8.ICustomerService代码如下:

点击查看代码
using DealerPlatform.Core.Repository;
using DealerPlatform.Domain.Models;
using DealerPlatform.Service.CustomerApp.Dto;

namespace DealerPlatform.Service.CustomerApp
{
	public interface ICustomerService
	{
		Task<bool> CheckPassword(CustomerLoginDto dto);
	}
}

只是一个登录的逻辑,这里我就不介绍过多了,大家应该都知道的

9.在DealerPlatform.Web的Controllers新增LoginController的api接口
代码如下

点击查看代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DealerPlatform.Service.CustomerApp;
using DealerPlatform.Service.CustomerApp.Dto;
using Microsoft.AspNetCore.Mvc;

namespace DealerPlatform.Web.Controllers
{
	[Route("[controller]")]
	public class LoginController : Controller
	{
		public LoginController(ICustomerService customerService)
		{
			CustomerService = customerService;
		}

		public ICustomerService CustomerService { get; }
		public async Task<string> CheckLogin(CustomerLoginDto dto)
		{
			var isSuccess = await CustomerService.CheckPassword(dto);
			//TODO 获取用户数据
			if (isSuccess)
			{
				return default;
			}
			return default;
		}
	}
}

10.LoginController想要调用service服务,我们就需要在整个web应用里注入这个服务
注入服务的方法如下:
在program中添加如下代码,在注入控制器之前写这段代码
检索程序集和jwt等,还有密码md5加密会在下面的文章中介绍

点击查看代码
builder.Services.AddTransient<ICustomerService, CustomerService>();

11.在appsetting.json中添加如下代码,为jwt做准备

"Jwt": {
"Issuer": "Ace",
"Audience": "Ace",
"Expires": 10,
"Security": "sadsadsadasdasdsadasdasdasdasdasdasdasdasdsad"
}
下一篇主要讲解md5加密及jwt授权鉴权

标签:TEntity,System,linq,仓储,var,using,NET,dbset,public
来源: https://www.cnblogs.com/humblexwang/p/16252593.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有