更新PersonsService.cs以使用Repository
using System;
using Entities;
using ServiceContracts.DTO;
using ServiceContracts;
using Services.Helpers;
using ServiceContracts.Enums;
using Microsoft.EntityFrameworkCore;
using CsvHelper;
using System.Globalization;
using CsvHelper.Configuration;
using System.Reflection;
using OfficeOpenXml;
using System.ComponentModel.DataAnnotations.Schema;
using RepositoryContracts;
namespace Services
{
public class PersonsService : IPersonsService
{
//private field
private readonly IPersonsRepository _personsRepository;
//constructor
public PersonsService(IPersonsRepository personsRepository)
{
_personsRepository = personsRepository;
}
//private PersonResponse ConvertPersonToPersonResponse(Person person)
//{
// PersonResponse personResponse = person.ToPersonResponse();
// //personResponse.Country = _countriesService.GetCountryByCountryId(person.CountryId)?.CountryName;
// personResponse.Country = person.Country?.CountryName;
// return personResponse;
//}
public async Task<PersonResponse> AddPerson(PersonAddRequest? personAddRequest)
{
//check if PersonAddRequest is not null
if (personAddRequest == null)
{
throw new ArgumentNullException(nameof(personAddRequest));
}
//Model validation
ValidationHelper.ModelValidation(personAddRequest);
//convert personAddRequest into Person type
Person person = personAddRequest.ToPerson();
//generate PersonId
person.PersonId = Guid.NewGuid();
//add person object to persons list
await _personsRepository.AddPersonAsync(person);
//_db.sp_InsertPerson(person);
//convert the Person object into PersonResponse type
return person.ToPersonResponse();
}
public async Task<List<PersonResponse>> GetAllPersons()
{
//SELECT * from Persons
var persons = await _personsRepository.GetAllPersonsAsync();
return persons
.Select(temp => temp.ToPersonResponse()).ToList();
//return _db.sp_GetAllPersons()
// .Select(p => ConvertPersonToPersonResponse(p)).ToList();
}
public async Task<PersonResponse?> GetPersonByPersonId(Guid? PersonId)
{
if (PersonId == null)
return null;
Person? person = await _personsRepository.GetPersonByPersonIdAsync(PersonId.Value);
if (person == null)
return null;
return person.ToPersonResponse();
}
public async Task<List<PersonResponse>> GetFilteredPersons(string searchBy, string? searchString)
{
List<Person> persons = searchBy switch
{
nameof(PersonResponse.PersonName) =>
(await _personsRepository.GetFilteredPersonsAsync(temp =>
temp.PersonName.Contains(searchString))).ToList(),
nameof(PersonResponse.Email) =>
(await _personsRepository.GetFilteredPersonsAsync(temp =>
temp.Email.Contains(searchString))).ToList(),
nameof(PersonResponse.DateOfBirth) =>
(await _personsRepository.GetFilteredPersonsAsync(temp =>
temp.DateOfBirth.Value.ToString("dd MMMM yyyy").Contains(searchString))).ToList(),
nameof(PersonResponse.Gender) =>
(await _personsRepository.GetFilteredPersonsAsync(temp =>
temp.Gender.Contains(searchString))).ToList(),
nameof(PersonResponse.CountryId) =>
(await _personsRepository.GetFilteredPersonsAsync(temp =>
temp.Country.CountryName.Contains(searchString))).ToList(),
nameof(PersonResponse.Address) =>
(await _personsRepository.GetFilteredPersonsAsync(temp =>
temp.Address.Contains(searchString))).ToList(),
_ => (await _personsRepository.GetAllPersonsAsync()).ToList()
};
return persons.Select(temp => temp.ToPersonResponse()).ToList();
}
public async Task<List<PersonResponse>> GetSortedPersons(List<PersonResponse> allPersons, string sortBy, SortOrderOptions sortOrder)
{
if (string.IsNullOrEmpty(sortBy))
return allPersons;
List<PersonResponse> sortedPersons = (sortBy, sortOrder) switch
{
(nameof(PersonResponse.PersonName), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.PersonName, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.PersonName), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.PersonName, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Email), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.Email, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Email), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.Email, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.DateOfBirth), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.DateOfBirth).ToList(),
(nameof(PersonResponse.DateOfBirth), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.DateOfBirth).ToList(),
(nameof(PersonResponse.Age), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.Age).ToList(),
(nameof(PersonResponse.Age), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.Age).ToList(),
(nameof(PersonResponse.Gender), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.Gender, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Gender), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.Gender, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Country), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.Country, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Country), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.Country, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Address), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.Address, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.Address), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.Address, StringComparer.OrdinalIgnoreCase).ToList(),
(nameof(PersonResponse.ReceiveNewsLetters), SortOrderOptions.ASC) => allPersons.OrderBy(temp => temp.ReceiveNewsLetters).ToList(),
(nameof(PersonResponse.ReceiveNewsLetters), SortOrderOptions.DESC) => allPersons.OrderByDescending(temp => temp.ReceiveNewsLetters).ToList(),
_ => allPersons
};
return sortedPersons;
}
public async Task<PersonResponse> UpdatePerson(PersonUpdateRequest? personUpdateRequest)
{
if (personUpdateRequest == null)
throw new ArgumentNullException(nameof(Person));
//validation
ValidationHelper.ModelValidation(personUpdateRequest);
//get matching person object to update
Person? matchingPerson = await _personsRepository.GetPersonByPersonIdAsync(personUpdateRequest.PersonId);
if (matchingPerson == null)
{
throw new ArgumentException("Given person id doesn't exist");
}
//update all details
await _personsRepository.UpdatePersonAsync(matchingPerson);
return matchingPerson.ToPersonResponse();
}
public async Task<bool> DeletePerson(Guid? PersonId)
{
if (PersonId == null)
{
throw new ArgumentNullException(nameof(PersonId));
}
Person? person = await _personsRepository.GetPersonByPersonIdAsync(PersonId.Value);
if (person == null)
return false;
await _personsRepository.DeletePersonByPersonIdAsync(PersonId.Value);
return true;
}
public async Task<MemoryStream> GetPersonsCSV()
{
MemoryStream memoryStream = new MemoryStream();
StreamWriter streamWriter = new StreamWriter(memoryStream);
CsvConfiguration csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture);
CsvWriter csvWriter = new CsvWriter(streamWriter, csvConfiguration, true);
csvWriter.WriteField(nameof(PersonResponse.PersonName));
csvWriter.WriteField(nameof(PersonResponse.Email));
csvWriter.WriteField(nameof(PersonResponse.DateOfBirth));
csvWriter.WriteField(nameof(PersonResponse.Age));
csvWriter.WriteField(nameof(PersonResponse.Gender));
csvWriter.WriteField(nameof(PersonResponse.Country));
csvWriter.WriteField(nameof(PersonResponse.Address));
csvWriter.WriteField(nameof(PersonResponse.ReceiveNewsLetters));
await csvWriter.NextRecordAsync();
List<PersonResponse> persons = (await _personsRepository.GetAllPersonsAsync())
.Select(p => p.ToPersonResponse()).ToList();
foreach (PersonResponse person in persons)
{
csvWriter.WriteField(person.PersonName);
csvWriter.WriteField(person.Email);
if (person.DateOfBirth.HasValue)
{
csvWriter.WriteField(person.DateOfBirth.Value.ToString("yyyy-MM-dd"));
}
else
{
csvWriter.WriteField("");
}
csvWriter.WriteField(person.Age);
csvWriter.WriteField(person.Gender);
csvWriter.WriteField(person.Country);
csvWriter.WriteField(person.Address);
csvWriter.WriteField(person.ReceiveNewsLetters);
await csvWriter.NextRecordAsync();
await csvWriter.FlushAsync();
}
memoryStream.Position = 0;
return memoryStream;
}
public async Task<MemoryStream> GetPersonsExcel()
{
MemoryStream memoryStream = new MemoryStream();
using (ExcelPackage excelPackage = new ExcelPackage(memoryStream))
{
ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("PersonsSheet");
worksheet.Cells["A1"].Value = nameof(PersonResponse.PersonName);
worksheet.Cells["B1"].Value = nameof(PersonResponse.Email);
worksheet.Cells["C1"].Value = nameof(PersonResponse.DateOfBirth);
worksheet.Cells["D1"].Value = nameof(PersonResponse.Age);
worksheet.Cells["E1"].Value = nameof(PersonResponse.Gender);
worksheet.Cells["F1"].Value = nameof(PersonResponse.Country);
worksheet.Cells["G1"].Value = nameof(PersonResponse.Address);
worksheet.Cells["H1"].Value = nameof(PersonResponse.ReceiveNewsLetters);
using (ExcelRange headerCells = worksheet.Cells["A1:H1"])
{
headerCells.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
headerCells.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
headerCells.Style.Font.Bold = true;
}
int row = 2;
List<PersonResponse> persons = (await _personsRepository.GetAllPersonsAsync())
.Select(p => p.ToPersonResponse()).ToList();
foreach (PersonResponse person in persons)
{
worksheet.Cells[row, 1].Value = person.PersonName;
worksheet.Cells[row, 2].Value = person.Email;
if (person.DateOfBirth.HasValue)
{
worksheet.Cells[row, 3].Value = person.DateOfBirth.Value.ToString("yyyy-MM-dd");
}
else
{
worksheet.Cells[row, 3].Value = "";
}
worksheet.Cells[row, 4].Value = person.Age;
worksheet.Cells[row, 5].Value = person.Gender;
worksheet.Cells[row, 6].Value = person.Country;
worksheet.Cells[row, 7].Value = person.Address;
worksheet.Cells[row, 8].Value = person.ReceiveNewsLetters;
row++;
}
worksheet.Cells[$"A1:H{row}"].AutoFitColumns();
await excelPackage.SaveAsync();
}
memoryStream.Position = 0;
return memoryStream;
}
}
}
为CRUDExample项目添加项目引用
Program.cs中添加如下代码
builder.Services.AddScoped<ICountriesRepository, CountriesRepository>();
builder.Services.AddScoped<IPersonsRepository, PersonsRepository>();
最后将UnitTest中构造函数的参数改为null(临时解决报错问题,后续将会完善)。
Gitee获取源码: