如何将属性添加到我没有存储在数据库中的 Web API 响应?
How do I add properties to a Web API Response that I do not store in my DB?
我正在使用 Entity Framework 6.0 构建一个 C# Web API。我有最简单的 User Class,它有 3 个属性,我坚持 SQL 到一个 User Table,有 3 个对应的列,其中 UserID 是它的主键。
public partial class User
{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
我想在 Web API 中添加两个我不想存储在我的数据库中的仅输出属性。我使用这些属性与不属于用户 Class 的消费客户端 "Status" 和 "Message" 信息进行通信。状态 = 正常|错误|警告。消息可以是 Web API 需要传回调用客户端的任何消息。
我的问题是:在不修改 [=27= 上的基础用户 Table 的情况下,在发回 Web API 的响应时即时添加这两个属性的最简单方法是什么]?我知道我可以将这两个作为虚拟列添加到用户 Table。当我在那里不需要它时,我不想在 SQL 端携带那些开销。
理想情况下,您应该在模型中创建一个数据传输对象 (DTO) class,其中包含您需要的所有属性,然后使用映射器将您的用户映射到 DTO
public class UserDto{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string Message {get; set;}
public string Status {get; set;}
}
那么在你的行动中
[ResponseType(typeof(UserDto))]
public IHttpActionResult User(string userId){
// retrive user from db
var userDto = Mapper.Map<UserDto>(dbUser);
if(condition){
userDto.Message = "the message";
userDto.Status = "the status";
}
return Ok(userDto);
}
然后你可以从 nuget 安装 Automapper 并配置它来为你做映射。
我会采用更通用的方法:
public class MyResponse<T>
{
public T Data {get;set;}
public Status ResponseStatus{get;set;}
public string Message{get;set;}
}
这样你就可以用同样的方式处理所有你models/data。
更新
[AllowAnonymous]
[RoutePrefix("api/home")]
public class HomeController : ApiController
{
[HttpGet]
[Route("ok")]
public MyResponse<MyUser> OK()
{
MyUser m = new MyUser();
var r = MyResponse<MyUser>.Success(m);
return r;
}
[Route("nok")]
[HttpGet]
public MyResponse<MyUser> NOK()
{
var r = MyResponse<MyUser>.Error("something went terribly wrong");
return r;
}
}
public class MyResponse<T>
{
public T Data { get; set; }
public Status ResponseStatus { get; set; }
public string Message { get; set; }
private MyResponse() { }
public static MyResponse<T> Success(T data)
{
return new MyResponse<T> { Data = data, ResponseStatus = Status.Success };
}
public static MyResponse<T> Error(string message)
{
return new MyResponse<T> { ResponseStatus = Status.Error, Message = message };
}
}
public class MyUser
{
public int Id { get; set; }
public string Name { get; set; }
}
public enum Status
{
Unknown = 0,
Success = 1,
Error
}
我正在使用 Entity Framework 6.0 构建一个 C# Web API。我有最简单的 User Class,它有 3 个属性,我坚持 SQL 到一个 User Table,有 3 个对应的列,其中 UserID 是它的主键。
public partial class User
{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
我想在 Web API 中添加两个我不想存储在我的数据库中的仅输出属性。我使用这些属性与不属于用户 Class 的消费客户端 "Status" 和 "Message" 信息进行通信。状态 = 正常|错误|警告。消息可以是 Web API 需要传回调用客户端的任何消息。
我的问题是:在不修改 [=27= 上的基础用户 Table 的情况下,在发回 Web API 的响应时即时添加这两个属性的最简单方法是什么]?我知道我可以将这两个作为虚拟列添加到用户 Table。当我在那里不需要它时,我不想在 SQL 端携带那些开销。
理想情况下,您应该在模型中创建一个数据传输对象 (DTO) class,其中包含您需要的所有属性,然后使用映射器将您的用户映射到 DTO
public class UserDto{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string Message {get; set;}
public string Status {get; set;}
}
那么在你的行动中
[ResponseType(typeof(UserDto))]
public IHttpActionResult User(string userId){
// retrive user from db
var userDto = Mapper.Map<UserDto>(dbUser);
if(condition){
userDto.Message = "the message";
userDto.Status = "the status";
}
return Ok(userDto);
}
然后你可以从 nuget 安装 Automapper 并配置它来为你做映射。
我会采用更通用的方法:
public class MyResponse<T>
{
public T Data {get;set;}
public Status ResponseStatus{get;set;}
public string Message{get;set;}
}
这样你就可以用同样的方式处理所有你models/data。
更新
[AllowAnonymous]
[RoutePrefix("api/home")]
public class HomeController : ApiController
{
[HttpGet]
[Route("ok")]
public MyResponse<MyUser> OK()
{
MyUser m = new MyUser();
var r = MyResponse<MyUser>.Success(m);
return r;
}
[Route("nok")]
[HttpGet]
public MyResponse<MyUser> NOK()
{
var r = MyResponse<MyUser>.Error("something went terribly wrong");
return r;
}
}
public class MyResponse<T>
{
public T Data { get; set; }
public Status ResponseStatus { get; set; }
public string Message { get; set; }
private MyResponse() { }
public static MyResponse<T> Success(T data)
{
return new MyResponse<T> { Data = data, ResponseStatus = Status.Success };
}
public static MyResponse<T> Error(string message)
{
return new MyResponse<T> { ResponseStatus = Status.Error, Message = message };
}
}
public class MyUser
{
public int Id { get; set; }
public string Name { get; set; }
}
public enum Status
{
Unknown = 0,
Success = 1,
Error
}