我正在构建一个 web api,例如我有这个控制器,
[RoutePrefix("api/v{version}/profile")]
public class ProfileController : BaseController
{
private readonly IPersonService _personService;
private readonly IPersonDtoBuilder _builder;
public ProfileController(IPersonService personService
IPersonDtoBuilder builder)
{
_personService = personService;
_builder = builder;
}
[HttpGet]
[Route("")]
public IHttpActionResult Get()
{
var person = _personService.GetPerson(UserId);
if (person == null)
return NotFound();
var model = _builder.Build(person);
return Ok(model);
}
作为 IPersonDtoBuilder 和 PersonDtoBuilder
public interface IPersonDtoBuilder
{
PersonDto Build(UrlHelper urlHelper, Person person);
}
public class PersonDtoBuilder : IPersonDtoBuilder
{
public PersonDto Build(UrlHelper urlHelper, Person person)
{
var model = new PersonDto
{
Links = new List<Link>
{
new Link
{
Rel = "update",
Href = urlHelper.Link("UpdateProfile", null),
Title = "Update"
}
},
FirstName = person.FirstName,
MiddleName = person.MiddleName,
LastName = person.Surname
};
return model;
}
}
}
personDto 是一个从 Resources 派生的模型,只是为了在所有派生类中都有一个属性 Links。
[DataContract]
public class PersonDto : Resource
{
[DataMember(Name = "firstName")]
public string FirstName { get; set; }
[DataMember(Name = "middleName")]
public string MiddleName { get; set; }
[DataMember(Name = "lastName")]
public string LastName { get; set; }
}
[DataContract]
public abstract class Resource
{
[DataMember(Name = "_links")]
public IEnumerable<Link> Links { get; set; }
}
我的问题是当我尝试在构建器中构建此链接时,因为我无权访问 Url.Link 方法。
我试图将它作为参数传递
PersonDto Build(UrlHelper urlHelper, Person person)
并以某种方式在基本控制器中初始化它
但我仍然无法正确初始化它。我该怎么做?
谢谢
编辑:阅读 Silvermind 评论后,我查看了我的基本控制器并弄清楚它是如何工作的
public abstract class BaseController : ApiController
{
UrlHelper _urlHelper;
protected UrlHelper TheUrlHelper
{
get
{
if (_urlHelper == null)
{
_urlHelper = new UrlHelper(this.Request);
}
return _urlHelper;
}
}
public long UserId { get; set; }
}
不确定这是否是将帮助程序传递给所有类的构建方法的最干净的方法,但它似乎解决了这个问题