RESTful API return 子实体
RESTful API return child entity
我正在设计一个网站 api,客户可以在其中检索有关课程的信息。
在我的模型中,实体课程有几个属性,包括 属性 讲师。讲师本身就是 class。
public class Course
{
public int Id { get; set; }
public string Title { get; set; }
public double? Duration { get; set; }
...
public Instructor Instructor { get; set; }
}
public class Instructor
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
...
}
我的问题是,我应该 return 在调用课程控制器时将所有 instructors 属性设置为 null 还是根本不重新运行它?
或者还有其他选择吗?
我不知道在这种情况下最佳做法是什么。当子实体是一个集合时,我通常只是 return 一个空数组。但在这种情况下,只有 1 个,所以我不能 return 一个空数组。
最佳做法是序列化该子实体,仅当从该请求返回时客户端需要它。否则,您只是在传输不必要的数据。
要让应用程序决定是否对其进行序列化,(使用 Newtonsoft)您可以实现自定义数据协定解析器并在序列化您的实体时使用它:
public class CustomDataContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if ((property.DeclaringType == typeof(Course) ||
property.DeclaringType.BaseType == typeof(Course)) &&
property.PropertyName == "Instructor")
{
property.ShouldSerialize =
instance =>
{
return true; // or false
};
}
return property;
}
}
我正在设计一个网站 api,客户可以在其中检索有关课程的信息。 在我的模型中,实体课程有几个属性,包括 属性 讲师。讲师本身就是 class。
public class Course
{
public int Id { get; set; }
public string Title { get; set; }
public double? Duration { get; set; }
...
public Instructor Instructor { get; set; }
}
public class Instructor
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
...
}
我的问题是,我应该 return 在调用课程控制器时将所有 instructors 属性设置为 null 还是根本不重新运行它? 或者还有其他选择吗?
我不知道在这种情况下最佳做法是什么。当子实体是一个集合时,我通常只是 return 一个空数组。但在这种情况下,只有 1 个,所以我不能 return 一个空数组。
最佳做法是序列化该子实体,仅当从该请求返回时客户端需要它。否则,您只是在传输不必要的数据。
要让应用程序决定是否对其进行序列化,(使用 Newtonsoft)您可以实现自定义数据协定解析器并在序列化您的实体时使用它:
public class CustomDataContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if ((property.DeclaringType == typeof(Course) ||
property.DeclaringType.BaseType == typeof(Course)) &&
property.PropertyName == "Instructor")
{
property.ShouldSerialize =
instance =>
{
return true; // or false
};
}
return property;
}
}