如何将属性添加到我没有存储在数据库中的 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
}