c# – 将接口传递给RESTFUL API调用

最近,我有一个面试问题,显示的问题是传递参数作为其界面.现在,我一直认为你必须通过混凝土,因为没有办法知道实现哪个实例化.另外,我总是认为你“可以”返回接口……但你应该返回混凝土(同样).

问:参数化接口是个坏主意吗?
问:返回界面“没问题”?
问:如果存在多个派生,您将如何知道实例化哪个派生?

更新 – 让它更清晰
很抱歉澄清……

如果我将其发送到服务器:
  – 它如何知道实例化哪个派生? (这应该失败……对吧?)

var customer = { Name: 'Frank The Tank',  Orders: [] } 
$.get(url, customer, cb);

对比,如果我发送到服务器:
  – 它如何知道实例化哪个派生?
  – 具体类型是否遵循? (我从未真正检查过)

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和USOrd​​erItem相比,这为此方法提供了更多可能的用途,这将使您锁定这些具体类型.通过使用interfacses,您可以传递任何客户并遍历返回的OrderItem.

回答你的问题

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

不,在你的场景中绝对不是一个坏主意.

问:返回界面“没问题”?

是的,返回接口只是返回实现该接口的任何类型.

问:如果存在多个派生,您将如何知道实例化哪个派生?

您可以收集对象的类型,它永远不会返回您的界面.

Type objectType = myObject.GetType();

然后,您可以根据需要投射对象. ref

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