Asp.Net Core中LinkGenerator类中的'GetUriByAction'方法没有定义在项目的Repository层中

问题描述 投票:0回答:1

Repository 层中的 EmployeeLinks 类。

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 指令或程序集引用?)。

我该如何修复它?

asp.net asp.net-core asp.net-web-api
1个回答
0
投票

链接生成器是

Microsoft.AspNetCore.App.Ref
的一部分,但您无法将其安装到存储库项目中。

而是修改您的存储库

.csproj
文件并添加:

<ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

这应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.