将接口传递到RESTFUL API调用
本文关键字:RESTFUL API 调用 接口 | 更新日期: 2023-09-27 18:21:04
最近,我遇到一个面试问题,显示的问题是传递一个参数作为其接口。现在,我一直认为你必须通过具体化,因为没有办法知道具体化哪个实例化。此外,我一直认为你"可以"返回接口。。。但你也应该归还混凝土。
问:参数化接口是个坏主意吗
问:返回接口是否"正常"
Q:如果存在多个派生,你将如何知道实例化哪个派生
更新-使其更加清晰
很抱歉对您的澄清。。。
如果我将其发送到服务器:
-它将如何知道实例化哪个派生?(这应该会失败…对吧?)
var customer = { Name: 'Frank The Tank', Orders: [] }
$.get(url, customer, cb);
Versus,如果我将其发送到服务器:
-它将如何知道实例化哪个派生
-具体类型如下吗?(我从来没有真正检查过)
var customer = new InsideSalesCustomer('Frank The Tank', []);
$.get(url, customer, cb);
var customer = new ExternalCustomer('Bilbo Baggins', []);
$.get(url, customer, cb);
代码示例:
public interface ICustomer
{
string Name { get; }
IEnumerable<IOrder> Orders { get; }
}
public interface IOrder
{
IEnumerable<IOrderItem> OrderItems { get; }
}
public interface IOrderItem
{
IEnumerable<IProduct> Products { get; }
}
public interface IProduct
{
string Name { get; }
}
public class CustomersController : ApiController
{
// I was always told Customer & OrderItem should be a concretes
public IEnumerable<IOrderItem> ListOrderItems(ICustomer customer)
{
// Return All OrderItems for all orders
return customer.Orders.SelectMany(o => o.OrderItems);
}
}
通过在这个场景中使用接口,您可以允许更多的代码重用。任何使用ICustomer
接口的客户都可以被传递到此方法中。此外,任何使用IOrderItem
的OrderItem都可以通过进行迭代。这为您提供了该方法的更多可能用途,而不仅仅使用USACustomers
和USOrderItem
,后者会将您锁定在这些具体类型中。通过使用interfacses,您可以传递任何客户并迭代返回的OrderItem。
回答您的问题
问:参数化接口是个坏主意吗
不,在你的情况下,这绝对不是一个坏主意。
问:返回接口是否"正常"
是的,返回一个接口就是返回实现该接口的任何类型。
Q:如果存在多个派生,你将如何知道实例化哪个派生
你可以收集对象的类型,它永远不会返回你的接口。
Type objectType = myObject.GetType();
然后,如果愿意,可以投射对象。参考
object result = Convert.ChangeType(input, someOtherObject.GetType());
这在WebAPI中实际上根本不起作用,这可能是面试问题的目标。
为什么?WebAPI模型绑定器将无法计算出给定ICustomer
的运行时类型,因此当您实际输入该方法时,您会看到ICustomer对象只是null,因为它在绑定过程中被跳过了。
我只是用一个非常简单的例子自己尝试了一下。如果我使用ICustomer
作为参数类型,它总是为null。如果我使用Customer
,一切都很好。
您可以通过使用自定义模型绑定器来使用接口作为参数,顺便说一句,它不能直接"开箱即用"。关于如何做到这一点,有很多材料,我在这里不谈。