Get(id)与GetAll()的不同类型

时间:2015-09-24 12:39:43

标签: asp.net-web-api

我正在创建一个非常简单的web api,允许我搜索内容:

public IEnumerable<Thing> GetAllThings()
{
    // get all the things!
}

我的应用程序必须能够检索单个事物:

public Thing GetThing(string id)
{
    // get a single thing
}

在检索单个Thing时,我需要更多详细信息,而不是在检索所有内容时。我应该有一个单独的控制器返回一个ThingWithDetails而不是在GetAllThings和GetThing上有单独的模型吗?

3 个答案:

答案 0 :(得分:0)

没有。您不必为ThingsWithDetails创建单独的控制器。只是有一个不同的重载方法。将根据请求

调用以下所有方法

当您使用url:api / {controller}

时,将调用以下方法
public IEnumerable<Thing> GetAllThings()
{
    // get all the things!
}

当您使用url:api / {controller} / 1

时,将调用以下方法
public Thing GetThing(string id)
{
    // get a single thing
}

当您使用url时,将调用以下方法:api / {controller}?id = 1&amp; name = xyz

public Thing GetThing(string id, string name)
{
    // get a single thing
}

答案 1 :(得分:0)

作为最佳实践,您应该拥有一个具有所有可能属性的Thing实体,因此您保持代码一致,并且默认情况下加载所有这些(假设它们来自数据库)。

如果您想要“隐藏”某些属性,可以使用扩展方法在返回它们之前将它们设置为null。

public class Thing
{
    public string PropertyA { get; set; }
    public string PropertyB { get; set; }
    public string PropertyC { get; set; }
}

// extension methods
public static class ThingExtensionMethods
{
    public static void ToBasicDetails(this Thing thing)
    {
        // hide properties
        thing.PropertyB = null;
        thing.PropertyC = null;
    }
}

public IEnumerable<Thing> GetAllThings()
{
    var things = _db.Things.ToList();
    foreach(var item in things)
    {
        item.ToBasicDetails();
    }

    return things;
}

public Thing GetThing(string id)
{
    var thing = _db.Things.Find(id);
    return thing;
}

答案 2 :(得分:0)

定义单独的&#34; Thing&#34;和&#34; ThingWithDetails&#34;模型很有意义,因为您将不同的资源类型返回给客户端。返回类型定义响应主体,因此对不同的响应格式使用不同的模型。

您不需要将这些方法放入单独的控制器中 - 有一个返回ThingWithDetails的操作和另一个返回IEnumerable的操作是有效的。归结为偏好。 (我可能会将它们留在同一个控制器中,因为它们正在处理相同的数据库实体。)

This教程展示了一个示例。