我正在创建一个非常简单的web api,允许我搜索内容:
public IEnumerable<Thing> GetAllThings()
{
// get all the things!
}
我的应用程序必须能够检索单个事物:
public Thing GetThing(string id)
{
// get a single thing
}
在检索单个Thing时,我需要更多详细信息,而不是在检索所有内容时。我应该有一个单独的控制器返回一个ThingWithDetails而不是在GetAllThings和GetThing上有单独的模型吗?
答案 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教程展示了一个示例。