2011-06-13 34 views
3

我有一种情况,我正在查询以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() 
     { 
      // ... 
     }; 
    } 
} 

然而,这仍然并不完全“感觉”的权利 - 的原因,我不能完全肯定的!

有没有更好的设计模式来应对这种情况呢?我觉得我错过了更优雅的东西?谢谢!

+1

LifeHistory可以返回一个空集合,而不是null。 – Robinson 2011-06-13 15:44:35

+0

@Robinson,然而,这可能是误导性的,因为空的生活史可能是FullResponse的一个有效状态。区分未查询的数据和合法为空的数据可能很重要。 – 2011-06-13 15:50:37

+0

@Robinson通常我会的,但是@Dan Bryant在这个例子中是正确的,因为null表示“没有数据查询”,而不是“没有数据返回”。 – 2011-06-13 15:54:31

回答

3

我我看来你描述一个代理模式。查看详情这里:Illustrated GOF Design Patterns in C#

+0

我想你可能是对的东西在这里,但如果可能的话,我可以用更清晰的例子做,... – 2011-06-13 16:03:05

+0

我没有图案专家,但我不知道我同意。代理模式通常具有对实际实例的内部引用。然后,代理负责在适当的时间实例化内部引用,并将代理的所有请求委托给代理的实例。顺便说一句。我想说你在CP上指出的例子也不是很理想,因为它直接暴露了代理对象,而不是将代理调用委托给代理对象。 – 2011-06-13 16:11:41

+0

@Chris Taylor,据我所知,你的意思是一个身份验证或远程代理,它们确实隐藏了客户端的真实对象。但是我提到了一个虚拟代理,它在临时轻量级对象实例中作为sevres并在第一次调用之后调用实际数据。也许懒惰加载这个模式更广泛使用的术语。 – 2011-06-13 16:31:33

2

我也有关于使用继承来的“额外数据”相加,而不是添加/修改行为唠叨不好的感觉。这样做的主要优点是您的方法可以指定它们在参数类型中需要的详细级别。

在这个特殊的例子中,我倾向于使用数据传输对象(Response对象)的第一种方法,但随后立即使用这个数据传输对象来创建数据模型对象,其确切性质取决于在你的具体应用上。数据传输对象应该是内部的(因为数据字段的存在或不存在是实现细节),并且公共对象或接口应该提供更适合消费代码的视图。

相关问题