c# - 用于返回可能并不总是完全填充的数据结构对象的设计模式?

标签 c# .net oop design-patterns data-structures

我遇到这样一种情况,我正在查询以 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/

相关文章:

c# - DllImport user32 与 user32.dll

java - 如何在 Java 中处理组合/聚合和多态性

JavaScript 范围转换 - 帮助我理解

c# - 有可能摆脱这个 Nuget Hell 场景吗?

c# - "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full"

c# - 如何删除 WinForms 中容器控件的边框填充?

c++ - 重载 [] 运算符

c# - Web API - 使用 HttpRequestMessage id 设置每个线程?

c# - uri 的相对路径

c# - 有没有办法编写适用于多种类型的扩展方法?