c# - 将接口(interface)传递给 RESTFUL API 调用

标签 c# rest asp.net-web-api

最近,我有一个面试问题,显示的问题是传递一个参数作为它的接口(interface)。现在,我一直觉得你必须通过具体的,因为没有办法知 Prop 体化哪个实例。此外,我一直认为您“可以”返回接口(interface)……但是您应该(也)返回具体的。

问:参数化接口(interface)是个坏主意吗?
问:返回接口(interface)“可以”吗?
问:如果存在多个,您如何知道要实例化哪个派生?

更新 - 使其更加清晰
抱歉澄清...

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

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);
    }
}

最佳答案

通过在这种情况下使用接口(interface),您可以实现更多的代码重用。任何使用 ICustomer 接口(interface)的客户都可以传递到此方法中。此外,任何使用 IOrderItem 的 OrderItem 都可以迭代。与仅使用 USACustomersUSOrd​​erItem 相比,这为该方法提供了更多可能的用途,后者会将您锁定在这些具体类型中。通过使用接口(interface),您可以传递任何客户并循环访问返回的 OrderItem。

回答你的问题

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

不,在您的场景中这绝对不是一个坏主意。

问:返回接口(interface)“正常”吗?

是的,返回接口(interface)只是返回实现该接口(interface)的任何类型。

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

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

Type objectType = myObject.GetType();

然后您可以根据需要转换该物体。 ref

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

关于c# - 将接口(interface)传递给 RESTFUL API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33570961/

相关文章:

c# - 如何确定任意一段 T-SQL 所需的参数?

.net - 可选参数 : "empty" vs "not provided"

java - 使用 REST 路由的 Camel 聚合

java - 连接 Java 和 Python Flask

java - 尝试使用 REST 生成 JSON 时出现 HTTP 500 错误

c# - WebApi 路由标识与同一 URL 匹配的多个 Controller 类型。怎么解决?

c# - WebApi - 如何包含所包含的 App_Data XML 文件的相对路径?

c# - 返回中间字母或回文字母的函数

c# - .wsuo 文件是什么?

c# - 即使启用了 ClearTypeHinting,WPF 中的文本也很模糊?