Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Soa 在服务层中切换客户端逻辑是否错误?_Soa - Fatal编程技术网

Soa 在服务层中切换客户端逻辑是否错误?

Soa 在服务层中切换客户端逻辑是否错误?,soa,Soa,我们有两个客户端应用程序(web应用程序和代理应用程序)访问同一服务上的方法,但要求略有不同。我的团队希望通过向每个方法传递ApplicationType参数来控制服务端的行为,该参数本质上是一个包含调用客户端应用程序名称的枚举,然后用作数据库查找的键,以使用特定于客户端的选项配置服务 这让我感到不安,因为我认为服务不应该真正知道哪个客户在呼叫它。有人告诉我,这样做比通过方法调用动态传递选项负载更容易 客户端应用程序告诉服务他们是谁有什么问题吗?或者,传递配置键与传递一组参数化选项之间真的没有区

我们有两个客户端应用程序(web应用程序和代理应用程序)访问同一服务上的方法,但要求略有不同。我的团队希望通过向每个方法传递ApplicationType参数来控制服务端的行为,该参数本质上是一个包含调用客户端应用程序名称的枚举,然后用作数据库查找的键,以使用特定于客户端的选项配置服务

这让我感到不安,因为我认为服务不应该真正知道哪个客户在呼叫它。有人告诉我,这样做比通过方法调用动态传递选项负载更容易

客户端应用程序告诉服务他们是谁有什么问题吗?或者,传递配置键与传递一组参数化选项之间真的没有区别吗

我能看到的一个直接问题是,如果我们曾经向第三方运行的另一个客户端打开服务,我们必须在本地为它们维护它们的配置设置。目前我们拥有这两个客户端应用程序,所以这不是什么大问题


你如何做到?

在一个分层的解决方案中,你应该总是把你的层看作洋葱状的层,并且依赖关系总是向内,从不向外。 因此,您的GUI/App层应该依赖于businesslogic层,businesslogic层应该依赖于数据访问层,等等

除非您对客户机(web、win、wpf、cli)进行分类,或者使用客户机配置文件(客户机应用程序可以配置)对其进行概括,否则我永远不会传入调用应用程序的名称,因为这将使业务逻辑层意识到并依赖于外部层

我们讨论的是什么样的差异取决于应用程序的类型?如果你在这里详细阐述一下不同之处,也许有人可以就解决这个问题的其他方法提出一些有用的建议


但我肯定会在走上您描述的道路之前寻找其他方法。

从设计角度来看,这与使用不同配置文件的用户没有什么不同。从安全的角度来看,我希望您的应用程序正在做一些事情来识别自己,以免一个应用程序的用户找到一种方法来调用其他应用程序逻辑作为黑客行为。(图为黑手党和银行同时使用的人力资源应用程序,一位客户可能会对在共享应用程序主机上入侵另一位客户的应用程序感兴趣)

在.net中,设计没有这种感觉,因为凭据位于线程上(即,当您设置IIPrincipal时,该信息位于线程上——它与每个方法调用一起通信,但不是作为参数)


也许您在寻找更优雅的设计时,需要的是ApplicationIdentity属性。您必须编写一个自定义的服务,我现在还不知道框架中有一个。

您不能为每个应用程序创建两个不同的服务吗?这两个服务将共享大量代码或调用具有不同参数化的单个内部服务,具体取决于调用的外部服务。

如果没有可靠的示例,这是一个很难讨论的主题

你这样想是对的。发送客户端类型以更改行为是不正确的。这对日志记录来说是个不错的主意。。。但仅此而已

下面是我要做的:

  • 回顾每种方法,看看有什么需要不同,为什么不同
  • 为不同的用途创建不同的方法。方法名称应该是自解释的。如果您需要破坏兼容性,您将拥有更多的控制权(假设您没有使用版本控制系统,这对于仅内部提供的服务来说是过度的)
  • 在某些情况下,请求参数(标志/枚举值)更合适
  • 在某些情况下,了解操作环境更合适(尤其是对于数据安全)。操作环境几乎总是在登录请求期间发送。类似于“有人参与”/“安全”(代理客户端)与“无人参与”/“不安全”(web客户端)的比较。现在必须交换会话密钥(HTTP cookie或应用程序级会话id)。如果您需要100%无状态,那么会话显然不起作用——特别是如果您希望在没有会话复制的情况下进行扩展。。。如果您有此要求,请在每个请求中发送一个结构
在代码中考虑类似函数的请求。您不会使用改变函数行为的神奇参数。您将创建多个函数,每个函数的行为都不同。使用函数的人决定调用哪个函数

那么,为什么客户端类型如此错误呢?客户机类型本身没有特定含义。它有很多含义,它们可能会随着时间的推移而改变。它只是一种信息,这就是为什么它是一个方便的日志。操作环境具有特定的含义

这里有一个需要考虑的场景:如果开发了一个新的客户机类型,但它的方式稍有不同,会破坏与原始请求的兼容性,该怎么办?现在您有两个请求。2个客户端使用请求A,1个客户端使用请求B。如果向每个请求传递一个客户端类型,则服务器将为每个可能的客户端类型工作。更难测试和维护