Soa 在服务层中切换客户端逻辑是否错误?
我们有两个客户端应用程序(web应用程序和代理应用程序)访问同一服务上的方法,但要求略有不同。我的团队希望通过向每个方法传递ApplicationType参数来控制服务端的行为,该参数本质上是一个包含调用客户端应用程序名称的枚举,然后用作数据库查找的键,以使用特定于客户端的选项配置服务 这让我感到不安,因为我认为服务不应该真正知道哪个客户在呼叫它。有人告诉我,这样做比通过方法调用动态传递选项负载更容易 客户端应用程序告诉服务他们是谁有什么问题吗?或者,传递配置键与传递一组参数化选项之间真的没有区别吗 我能看到的一个直接问题是,如果我们曾经向第三方运行的另一个客户端打开服务,我们必须在本地为它们维护它们的配置设置。目前我们拥有这两个客户端应用程序,所以这不是什么大问题Soa 在服务层中切换客户端逻辑是否错误?,soa,Soa,我们有两个客户端应用程序(web应用程序和代理应用程序)访问同一服务上的方法,但要求略有不同。我的团队希望通过向每个方法传递ApplicationType参数来控制服务端的行为,该参数本质上是一个包含调用客户端应用程序名称的枚举,然后用作数据库查找的键,以使用特定于客户端的选项配置服务 这让我感到不安,因为我认为服务不应该真正知道哪个客户在呼叫它。有人告诉我,这样做比通过方法调用动态传递选项负载更容易 客户端应用程序告诉服务他们是谁有什么问题吗?或者,传递配置键与传递一组参数化选项之间真的没有区
你如何做到?在一个分层的解决方案中,你应该总是把你的层看作洋葱状的层,并且依赖关系总是向内,从不向外。 因此,您的GUI/App层应该依赖于businesslogic层,businesslogic层应该依赖于数据访问层,等等 除非您对客户机(web、win、wpf、cli)进行分类,或者使用客户机配置文件(客户机应用程序可以配置)对其进行概括,否则我永远不会传入调用应用程序的名称,因为这将使业务逻辑层意识到并依赖于外部层 我们讨论的是什么样的差异取决于应用程序的类型?如果你在这里详细阐述一下不同之处,也许有人可以就解决这个问题的其他方法提出一些有用的建议
但我肯定会在走上您描述的道路之前寻找其他方法。从设计角度来看,这与使用不同配置文件的用户没有什么不同。从安全的角度来看,我希望您的应用程序正在做一些事情来识别自己,以免一个应用程序的用户找到一种方法来调用其他应用程序逻辑作为黑客行为。(图为黑手党和银行同时使用的人力资源应用程序,一位客户可能会对在共享应用程序主机上入侵另一位客户的应用程序感兴趣) 在.net中,设计没有这种感觉,因为凭据位于线程上(即,当您设置IIPrincipal时,该信息位于线程上——它与每个方法调用一起通信,但不是作为参数)
也许您在寻找更优雅的设计时,需要的是ApplicationIdentity属性。您必须编写一个自定义的服务,我现在还不知道框架中有一个。您不能为每个应用程序创建两个不同的服务吗?这两个服务将共享大量代码或调用具有不同参数化的单个内部服务,具体取决于调用的外部服务。如果没有可靠的示例,这是一个很难讨论的主题 你这样想是对的。发送客户端类型以更改行为是不正确的。这对日志记录来说是个不错的主意。。。但仅此而已 下面是我要做的:
- 回顾每种方法,看看有什么需要不同,为什么不同
- 为不同的用途创建不同的方法。方法名称应该是自解释的。如果您需要破坏兼容性,您将拥有更多的控制权(假设您没有使用版本控制系统,这对于仅内部提供的服务来说是过度的)
- 在某些情况下,请求参数(标志/枚举值)更合适
- 在某些情况下,了解操作环境更合适(尤其是对于数据安全)。操作环境几乎总是在登录请求期间发送。类似于“有人参与”/“安全”(代理客户端)与“无人参与”/“不安全”(web客户端)的比较。现在必须交换会话密钥(HTTP cookie或应用程序级会话id)。如果您需要100%无状态,那么会话显然不起作用——特别是如果您希望在没有会话复制的情况下进行扩展。。。如果您有此要求,请在每个请求中发送一个结构