面向对象与基于参数的WCF调用?

时间:2012-05-15 10:12:20

标签: c# wcf oop

不久前,我开始了一项新工作,他们一直在使用WCF来处理UI和后端之间的所有数据/业务逻辑,这很棒。

我注意到的是,绝大多数这些WCF服务调用都包含各种参数。例如,假设您有一个名为GetFoo的服务调用。在这里,我们可以使用如下签名:

public Foo GetFoo(int? ID, string Name, DateTime? fooDate)

对于更面向对象的方法,您可以使用:

public Foo GetFoo(Foo foo)

在这种情况下,代码从Foo POCO对象中获取所需内容,而不是依赖于从UI传入的一组特定参数。

一方面,这提供了UI和WCF服务之间更灵活的合同。我们可以在服务方面对实现进行更改,而不会破坏任何合同并更新引用。此外,我们可以拥有直接作用于POCO的业务对象与处理明确的参数列表。

另一方面,目前尚不清楚需要什么才能获得想要的对象/数据。

哪种方法被认为是最佳做法?

4 个答案:

答案 0 :(得分:1)

我总是选择进出单个参数。该参数定义了我期望的数据的消息(或至少是消息体),返回定义了我要发回的消息体

如果您使用多个参数,则无法控制线路上的消息。

合同操作是.NET方法的事实是一个实现细节。合同的目标是定义消费者和服务之间的消息结构。

答案 1 :(得分:1)

我建议采用第三种更冗长的方法:

public Foo GetFooByName(string Name)
public Foo GetFooByIDAndName(int ID, string Name)
public Foo GetFooByNameAndDate(string Name, DateTime fooDate)
public Foo GetFooByIDNameAndDat(int ID, string Name, DateTime fooDate)

依此类推。为了DRY,您可以提取公共代码并制作一些private方法。这导致了自我描述代码,并且可以更准确地确定错误(更不用说你可以改变一种方法,而不会影响其他方法,这总是好的。)

答案 2 :(得分:0)

你可以同时拥有这两者,但应该清楚它们的含义。你现在掌握的两种方法都不清楚它们的作用。第一个:

如果我通过了:

会发生什么
ID = 1
Name = "Name"
fooDate = NULL

然后我要求id = 1且name =“Name”的项目或者我要求id = 1和name =“Name”并且fooDate = null或者我要求id = 1或name =“Name” ro fooDate = null。

在这种情况下,Id至少应该是一个独立的功能。

在你的第二个样本中你已经创建了一个我应该通过例子调用的函数。但是,侯不能要求特定的NULL值。除此之外,我不会称之为面向对象的apprach因为你传入了一个对象。 OO更多地是关于对象如何与彼此交互。

在选择approch时,要明确你的功能。如果确实需要一个可以传入对象并构建动态查询的函数。调用函数GetFooByFooExample。但是,如果您只填写id,请考虑像GetFooById这样的函数,这使您的代码更具可读性和自我解释。

答案 3 :(得分:0)

OOP是我们大多数人所追求的目标。如果你意识到这一点,你需要在Foo对象上有一个新属性,而Foo对象有15-20个方法,这些方法有子方法等等,这只是臭臭的代码,它可以节省你做正确的事情的时间(oop imo :))。

How many parameters are too many?更多信息

我建议您查看Martin Fowlers关于重构的书,他说大多数程序员都在想,但出于某种原因我们不这样做。