我正在创建一个Asp.Net MVC Rest Api。我有两件事。一个是我有一个用户,另一个是预订。根据用户类型返回结果。如果用户可以访问城市A,则表示他只能查看城市A的预订。 我想根据3个参数搜索预订
由于用户对象取决于预订,我的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)
{}
答案 0 :(得分:5)
从逻辑上讲,Booking
不是User
,我们不能说预订是每天生活中的用户,因此您无法使用继承。< / p>
如果您考虑一下,Booking
不属于特定的User
而User
没有特定的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
。