Wcf 需要一些关于web服务API的建议吗?

Wcf 需要一些关于web服务API的建议吗?,wcf,web-services,design-patterns,Wcf,Web Services,Design Patterns,我的公司有一款产品,我觉得它可以从web服务API中获益。我们使用MSMQ通过后端系统来回路由消息。目前,我们正在构建一个ASP.Net应用程序,该应用程序与一个web服务(WCF)进行通信,而该web服务又为我们与MSMQ进行通信。以后,我们可能会有其他客户端应用程序(不一定是用.Net编写的)。进入MSMQ的消息是一个具有由字符串数组组成的属性的对象。还有一个属性包含将通过系统路由的命令(字符串)。就个人而言,我不是一个超级粉丝,但我被告知这是为了可伸缩性,每个系统都可以使用字符串 关于we

我的公司有一款产品,我觉得它可以从web服务API中获益。我们使用MSMQ通过后端系统来回路由消息。目前,我们正在构建一个ASP.Net应用程序,该应用程序与一个web服务(WCF)进行通信,而该web服务又为我们与MSMQ进行通信。以后,我们可能会有其他客户端应用程序(不一定是用.Net编写的)。进入MSMQ的消息是一个具有由字符串数组组成的属性的对象。还有一个属性包含将通过系统路由的命令(字符串)。就个人而言,我不是一个超级粉丝,但我被告知这是为了可伸缩性,每个系统都可以使用字符串

关于web服务,我的想法是基于我们的数据对一些对象进行建模,这些数据可以传入和传出web服务,以便客户机可以轻松地使用它们。最初,我传递的是上面提到的消息对象,其中包含字符串数组。我发现我在客户机上创建对象来表示数据,让客户机负责创建这些对象。我觉得web服务层真的应该处理这个问题。这就是我一直与服务部门合作的方式。我这样做是为了更容易在客户机上移动数据

有人向我们的团队建议,我们应该通过提供一个包含命令的对象来维护系统的“单一入口点”,并使用一个web服务来处理所有事情。因此,web服务中有一个方法,我们称之为MakeRequest,它将返回一个对象(序列化XML或JSON)。建议使用一个基本对象,该对象可能包含其他对象可以从中继承的某种命令列表。任何其他对象都可以有自己的命令结构,但仍然继承基本命令。现在还不清楚从服务传回的内容,但可能是“消息对象”,其中附加了一个表示数据的对象。我不知道

我的建议是根据实际数据对对象进行建模,并为我们正在处理的数据类型创建服务。我们将创建一个基本服务接口,其中包含用于所有服务的任何通用方法。例如,GetById、GetByName、GetAll、Save等。特定于给定服务的任何内容都将针对特定的实现进行实现。因此,用户服务可能有一个方法getUserByUserName和Password,但由于它实现了基本接口,因此它还将包含“基本”方法。我们在一个服务中有几个方法,这些方法将根据所调用的服务返回预期的对象类型。我们可以把所有的东西都放在一个服务中,但我仍然想得到一些更有用的东西。我觉得这种方法使客户机无法决定要传递什么命令。当我连接到一个用户服务并调用GetById(intid)方法时,我希望返回一个用户对象

当我开始开发WCF服务时,我有幸与微软合作。所以,我有一个良好的基础和理解的技术,但我不是一个设计它这个时候。
因此,我并不反对“单一入口点”的想法,但如果您能想到为什么其中一种方法比另一种方法更具可扩展性,我将不胜感激。我以前从未使用过如此系统化的服务层方法。也许我需要克服这一点?

我认为这两种方法都有优点

通常,如果您编写的API将由一个完全独立的开发人员组(可能在另一家公司)使用,那么您希望API尽可能具有自我解释性和可发现性。从消费者的角度来看,使用返回特定对象的特定web服务方法更容易

然而,许多公司将web服务作为其应用程序的许多层之一。在这种情况下,使用通用API可能会减少维护。我见过一些聪明的机制,它们不需要对服务进行任何更改就可以向从数据库返回的表中添加另一列

我个人偏好特定的API。我认为具体的方法更容易使用,而且基本上是自我记录的。特定的操作需要在某个时刻执行,所以为什么不公开它的内容呢?如果你写道:

public void MyApiMethod(string operationToPerform, params object[] args)
{
    switch(operationToPerform)
    {
        case "InsertCustomer":
            InsertCustomer(args);
            break;
        case "UpdateCustomer":
            UpdateCustomer(args);
            break;
        ...
        case "Juggle5BallsAtOnce":
            Juggle5BallsAtOnce(args);
            break;
    }
}
那么,为什么要使用Web服务来实现这一点呢?最好有:

public void InsertCustomer(Customer customer)
{
    ...
}

public void UpdateCustomer(Customer customer)
{
    ...
}

...

public void Juggle5BallsAtOnce(bool useApplesAndEatThemConcurrently)
{
    ...
}

我认为这两种方法都有优点

通常,如果您编写的API将由一个完全独立的开发人员组(可能在另一家公司)使用,那么您希望API尽可能具有自我解释性和可发现性。从消费者的角度来看,使用返回特定对象的特定web服务方法更容易

然而,许多公司将web服务作为其应用程序的许多层之一。在这种情况下,使用通用API可能会减少维护。我见过一些聪明的机制,它们不需要对服务进行任何更改就可以向从数据库返回的表中添加另一列

我个人偏好特定的API。我认为具体的方法更容易使用,而且基本上是自我记录的。特定的操作需要在某个时刻执行,所以为什么不公开它的内容呢?如果你写道:

public void MyApiMethod(string operationToPerform, params object[] args)
{
    switch(operationToPerform)
    {
        case "InsertCustomer":
            InsertCustomer(args);
            break;
        case "UpdateCustomer":
            UpdateCustomer(args);
            break;
        ...
        case "Juggle5BallsAtOnce":
            Juggle5BallsAtOnce(args);
            break;
    }
}
那么,为什么要使用Web服务来实现这一点呢?最好有:

public void InsertCustomer(Customer customer)
{
    ...
}

public void UpdateCustomer(Customer customer)
{
    ...
}

...

public void Juggle5BallsAtOnce(bool useApplesAndEatThemConcurrently)
{
    ...
}

我认为这是有史以来最长的问题;-)我知道;)我有时很啰嗦,但我喜欢尽可能多地提供信息。你应该看看我的一些电子邮件。收到这些信息时,你可以在互联网上听到它们的叹息声;)我认为这是有史以来最长的问题;-)我知道;)我有时会唠叨个不停,但我喜欢这样