我有一种情况,我正在查询以XML格式返回数据的RESTful Web服务(使用.NET)。我围绕API编写了封装函数,以便不用返回原始XML,而是返回反映XML结构的完整.NET对象。 XML可能非常复杂,因此这些对象可能非常大并且嵌套严密(即包含可能容纳其他集合等的集合)。用于返回可能不总是完全填充的数据结构对象的设计模式?
的REST API有一个选项可以返回一个完整的结果或基本结果。基本结果返回整个结果所做的一小部分数据。目前,我正在通过为两种类型的请求返回相同的.NET对象来处理两种类型的响应 - 但在基本请求中,某些属性未被填充。这是最好的代码的(非常过于简单化)的例子所示:
public class PersonResponse
{
public string Name { get; set; }
public string Age { get; set; }
public IList<HistoryDetails> LifeHistory { get; set; }
}
public class PersonRequest
{
public PersonResponse GetBasicResponse()
{
return new PersonResponse()
{
Name = "John Doe",
Age = "50",
LifeHistory = null
};
}
public PersonResponse GetFullResponse()
{
return new PersonResponse()
{
Name = "John Doe",
Age = "50",
LifeHistory = PopulateHistoryUsingExpensiveXmlParsing()
};
}
}
正如你可以看到PersonRequest
类有两个方法,这两个返回PersonResponse
对象。但GetBasicResponse
方法是“精简”版本 - 它不会填充所有属性(在示例中,它不会填充LifeHistory
集合,因为这是一个'昂贵'的操作)。注意这是一个非常简单的版本。
但是,对我来说这有一定的气味给它(因为GetBasicResponse
方法的调用者需要了解哪些属性将不会填充)。
我在想更多的OOP方法将是有两个PersonResponse
对象 - 一个BasicPersonResponse
对象和一个FullPersonResponse
与后者继承前者。喜欢的东西:
public class BasicPersonResponse
{
public string Name { get; set; }
public string Age { get; set; }
}
public class FullPersonResponse : BasicPersonResponse
{
public IList<object> LifeHistory { get; set; }
}
public class PersonRequest
{
public BasicPersonResponse GetBasicResponse()
{
return new FullPersonResponse()
{
// ...
};
}
public FullPersonResponse GetFullResponse()
{
return new FullPersonResponse()
{
// ...
};
}
}
然而,这仍然并不完全“感觉”的权利 - 的原因,我不能完全肯定的!
有没有更好的设计模式来应对这种情况呢?我觉得我错过了更优雅的东西?谢谢!
LifeHistory可以返回一个空集合,而不是null。 – Robinson 2011-06-13 15:44:35
@Robinson,然而,这可能是误导性的,因为空的生活史可能是FullResponse的一个有效状态。区分未查询的数据和合法为空的数据可能很重要。 – 2011-06-13 15:50:37
@Robinson通常我会的,但是@Dan Bryant在这个例子中是正确的,因为null表示“没有数据查询”,而不是“没有数据返回”。 – 2011-06-13 15:54:31