将接口传递到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);
    }
}

将接口传递到RESTFUL API调用

通过在这个场景中使用接口,您可以允许更多的代码重用。任何使用ICustomer接口的客户都可以被传递到此方法中。此外,任何使用IOrderItem的OrderItem都可以通过进行迭代。这为您提供了该方法的更多可能用途,而不仅仅使用USACustomersUSOrderItem,后者会将您锁定在这些具体类型中。通过使用interfacses,您可以传递任何客户并迭代返回的OrderItem。

回答您的问题

问:参数化接口是个坏主意吗

不,在你的情况下,这绝对不是一个坏主意。

问:返回接口是否"正常"

是的,返回一个接口就是返回实现该接口的任何类型。

Q:如果存在多个派生,你将如何知道实例化哪个派生

你可以收集对象的类型,它永远不会返回你的接口。

Type objectType = myObject.GetType();

然后,如果愿意,可以投射对象。参考

object result = Convert.ChangeType(input, someOtherObject.GetType());

这在WebAPI中实际上根本不起作用,这可能是面试问题的目标。

为什么?WebAPI模型绑定器将无法计算出给定ICustomer的运行时类型,因此当您实际输入该方法时,您会看到ICustomer对象只是null,因为它在绑定过程中被跳过了。

我只是用一个非常简单的例子自己尝试了一下。如果我使用ICustomer作为参数类型,它总是为null。如果我使用Customer,一切都很好。

您可以通过使用自定义模型绑定器来使用接口作为参数,顺便说一句,它不能直接"开箱即用"。关于如何做到这一点,有很多材料,我在这里不谈。