using Contracts;
using Microsoft.AspNetCore.Routing;
using Entities.LinkModels;
using Entities.Models;
using Shared.DataTransferObjects;
using Microsoft.AspNetCore.Mvc.Formatters;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace Repository.Extensions.Utility
{
public class EmployeeLinks : IEmployeeLinks
{
private readonly LinkGenerator _linkGenerator;
private readonly IDataShaper<EmployeeDto> _dataShaper;
public EmployeeLinks(LinkGenerator linkGenerator, IDataShaper<EmployeeDto> dataShaper)
{
_linkGenerator = linkGenerator;
_dataShaper = dataShaper;
}
public LinkResponse TryGenerateLinks(IEnumerable<EmployeeDto> employeesDto, string fields, Guid companyId, HttpContext httpContext)
{
var shapedEmployees = ShapeData(employeesDto, fields);
if (ShouldGenerateLinks(httpContext))
return ReturnLinkdedEmployees(employeesDto, fields, companyId, httpContext, shapedEmployees);
return ReturnShapedEmployees(shapedEmployees);
}
private List<Entity> ShapeData(IEnumerable<EmployeeDto> employeesDto, string fields) =>
_dataShaper.ShapeData(employeesDto, fields)
.Select(e => e.Entity)
.ToList();
private bool ShouldGenerateLinks(HttpContext httpContext)
{
var mediaType = (MediaTypeHeaderValue)httpContext.Items["AcceptHeaderMediaType"];
return mediaType.SubTypeWithoutSuffix.EndsWith("hateoas", StringComparison.InvariantCultureIgnoreCase);
}
private LinkResponse ReturnShapedEmployees(List<Entity> shapedEmployees) =>
new LinkResponse { ShapedEntities = shapedEmployees };
private LinkResponse ReturnLinkdedEmployees(IEnumerable<EmployeeDto> employeeDto, string fields, Guid companyId,
HttpContext httpContext, List<Entity> shapedEmployees)
{
var employeeDtoList = employeeDto.ToList();
for(var index = 0; index < shapedEmployees.Count; index++)
{
var employeeLinks = CreateLinksForEmployee(httpContext, companyId, employeeDtoList[index].Id, fields);
shapedEmployees[index].Add("Links", employeeLinks);
}
var employeeCollection = new LinkCollectionWrapper<Entity>(shapedEmployees);
var linkedEmployees = CreateLinksForEmployees(httpContext, employeeCollection);
return new LinkResponse { HasLinks = true, LinkedEntities = linkedEmployees };
}
private List<Link> CreateLinksForEmployee(HttpContext httpContext, Guid companyId, Guid id, string fields = "")
{
var links = new List<Link>
{
new Link(_linkGenerator.GetPathByAction(httpContext, "GetEmployeeForCompany", "Employees", values: new {companyId, id, fields}),
"self",
"GET"),
new Link(_linkGenerator.GetUriByAction(httpContext,"DeleteEmployeeForCompany", "Employees", values: new { companyId, id }),
"delete_employee",
"DELETE"),
new Link(_linkGenerator.GetUriByAction(httpContext, "UpdateEmployeeForCompany", "Employees", values: new { companyId, id }),
"update_employee",
"PUT"),
new Link(_linkGenerator.GetUriByAction(httpContext, "PartiallyUpdateEmployeeForCompany", "Employees", values: new { companyId, id }),
"partially_update_employee",
"PATCH")
};
return links;
}
private LinkCollectionWrapper<Entity> CreateLinksForEmployees(HttpContext httpContext, LinkCollectionWrapper<Entity> employeesWrapper)
{
employeesWrapper.Links.Add(new Link(_linkGenerator.GetUriByAction(httpContext, "GetEmployeesForCompany", values: new { }),
"self",
"GET"));
return employeesWrapper;
}
}
}
当我在表示层(即控制器)中尝试 LinkGenerator 类时,“GetUriByAction”可以正常工作,没有任何异常。但它在 Repository 层的 EmployeeLinks 类中不起作用。它显示以下错误: “LinkGenerator”不包含“GetUriByAction”的定义,并且找不到接受“LinkGenerator”类型的第一个参数的可访问扩展方法“GetUriByAction”(您是否缺少 using 指令或程序集引用?)。
我该如何修复它?
链接生成器是
Microsoft.AspNetCore.App.Ref
的一部分,但您无法将其安装到存储库项目中。
而是修改您的存储库
.csproj
文件并添加:
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
这应该可以解决您的问题。