继承与类的属性

时间:2017-12-19 10:59:41

标签: c# rest

我正在创建一个Asp.Net MVC Rest Api。我有两件事。一个是我有一个用户,另一个是预订。根据用户类型返回结果。如果用户可以访问城市A,则表示他只能查看城市A的预订。 我想根据3个参数搜索预订

  • 位置
  • 日期 OR
  • BookingId 无论是前三名还是单独的bookingId +用户参数。

由于用户对象取决于预订,我的RestApi模型类应该如何设计。

应该是

public class Booking : User{}
OR
public class Booking{ public User user { get;set; } }

搜索预订时需要用户详细信息。用户是指登录并使用系统并搜索预订的人。

RestApi方法如下所示:

    [HttpPost]
    public HttpResponseMessage GetBookings(Booking booking)
    {}

我想知道这种方法的优点和缺点,并建议我是否有更好的方法。

基于讨论[编辑]

它的逻辑程度如果我在我的api.Client中为用户接受另一个参数,他正在调用我的Api,必须将它作为参数传递。现在的代码是这样的吗?

[HttpPost]
public HttpResponseMessage GetBookings(Booking booking,User user)
{}

2 个答案:

答案 0 :(得分:5)

从逻辑上讲,Booking不是User,我们不能说预订是每天生活中的用户,因此您无法使用继承。< / p>

如果您考虑一下,Booking不属于特定的UserUser没有特定的Booking。当这样考虑时,我们可以看到两者之间并没有真正的关系,所有用户都可以看到所有预订,唯一的限制是用户是否真的有权查看所有这些或只是其中的一部分。

更简洁的方法是使用User类型并根据需要获取所有Booking(如果需要,还可以使用其他一些标准,如城市,位置等..)。所以我这样做的方法是不要在两个类之间建立关系,只是处理真正的关系,因为每个User只能看到由其类型指定的Booking

答案 1 :(得分:2)

而不是进入@Haitam做得很好的理论元素。我将专注于实现细节

现在正确或错误,我将以下列方式构建逻辑:

//Lets seal the class to prevent inheritance unless you want to conform to O/C SOLID Principle
public sealed class User
{
    public int Id {get;set;}
    public IEnumerable<Booking> Bookings {get;set;}
}

现在假设用户可能包含“预订”

//Lets take it up a notch and leave behind implementation specifics and fully encapsulate
//With DI/IoC in mind
private IBookingService _bookingService;
public SomeController(IBookingService bookingService)
{
    _bookingService = bookingService;
}

[HttpGet]
public async Task<HttpResponseMessage> GetUserBookingsAsync(int userId)
{
   return await _bookingService.GetUserBookingsAsync(userId);
}

除了Booking 的奇怪结构有一个 User之外,我宁愿把它变成一个   更符合逻辑,也避免inheritance,因为在实用意义上没有任何关系。

User成为User,可选Bookings