我遇到这样一种情况,我正在查询以 XML 形式返回数据的 RESTful Web 服务(使用 .NET)。我围绕 API 编写了包装函数,这样我就不会返回原始 XML,而是返回反射(reflect) 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
方法的调用者需要了解哪些属性不会被填充)。
我在想一个更面向对象的方法是有两个 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()
{
// ...
};
}
}
但是,这仍然不太“感觉”正确——出于我不完全确定的原因!
是否有更好的设计模式来应对这种情况?我觉得我缺少更优雅的东西?谢谢!
最佳答案
我认为您描述了代理模式。在此处查看详细信息:Illustrated GOF Design Patterns in C#
关于c# - 用于返回可能并不总是完全填充的数据结构对象的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6332666/