在阅读了有关Ports和Adapters架构的不同来源(包括Alistair Cockburn的原始文章)后,我仍然不确定术语"端口"和"适配器"的确切含义 - 特别是在将这些概念映射到实现工件时.
几个来源(例如这篇文章)暗示这种体系结构模式中的端口是外部的工件,其次是中间层中的适配器,它们在端口和处于核心的应用程序之间进行转换.
但是,在Cockburn的原始文章中,端口出现在适配器层的外部和内部,具体取决于通信方向:
实际上对我来说,"全部外部"方法和"内部和外部"方法都没有意义 - 我会将端口看作始终放在应用程序旁边的工件,而不管通信方向如何.Imo这也与端口和适配器的比喻一致:E.g.有一个带有串行端口的设备,要连接另一台没有串口的设备,我需要一个适配器,从我的设备的角度来调整入站和出站通信.
来到这个体系结构的实现,我会看到端口的定义,而不是作为我的应用程序的一部分,我会看到不同的适配器是我的应用程序的"外部".E. g.单个端口的实现可以包括facade(由适配器调用以进行入站通信)和interface(由适配器实现用于出站通信).
术语端口和适配器的正确含义是什么?如何将这些概念映射到实现工件?
更新:
发现这篇文章类似于我的理解.如果存在某种共同协议,问题仍然存在.
我目前正在开发我的第一个backbone.js应用程序.事件的概念对我来说非常熟悉,但如果我应该使用中央事件调度员,我有疑问.一般来说,我看到这两种方法:
在应用程序的长时间可维护性和事件的可追溯性方面,使用事件总线是否有利?
我用Apache Camel和JMS创建了一个简单的请求/回复设置.一切正常 - 调用被分派到服务器端服务,结果返回给客户端.只有在服务器端出现异常时,才会将此异常返回给调用者.服务器上出现异常,客户端收到超时.我想在客户端收到例外.
据我了解的可用文档,我想要的应该是默认行为.我也玩过onException子句或为后传传递设置另一条路线,但所有这些都没有帮助.所以我的问题是我在设置中缺少什么来将异常返回给调用者?
以下是详细信息(代码简化):
客户端和服务器之间交换的DTO/Exception:
public class RequestDTO implements Serializable {
String payload;
...
}
public class ResponseDTO implements Serializable {
String payload;
...
}
public class RmtServiceException extends Exception implements Serializable {
public RmtServiceException() {
super("Exception in service.");
}
}
Run Code Online (Sandbox Code Playgroud)
通过JMS调用的服务接口:
public interface RmtService {
ResponseDTO doSomething(RequestDTO request) throws RmtServiceException;
}
Run Code Online (Sandbox Code Playgroud)
服务的实施:
@Component("rmtService")
public class RmtServiceImpl implements RmtService {
public ResponseDTO doSomething(RequestDTO request) throws RmtServiceException {
// Return …Run Code Online (Sandbox Code Playgroud) 我试图了解Play 2.0框架的反应I/O概念.为了从一开始就更好地理解,我决定跳过框架的助手来构造不同类型的迭代,并Iteratee从头开始编写一个自定义BodyParser来解析请求体.
从Iteratees和ScalaBodyParser文档中提供的信息开始,以及关于播放被动I/O的两个演示文稿,这就是我想出的:
import play.api.mvc._
import play.api.mvc.Results._
import play.api.libs.iteratee.{Iteratee, Input}
import play.api.libs.concurrent.Promise
import play.api.libs.iteratee.Input.{El, EOF, Empty}
01 object Upload extends Controller {
02 def send = Action(BodyParser(rh => new SomeIteratee)) { request =>
03 Ok("Done")
04 }
05 }
06
07 case class SomeIteratee(state: Symbol = 'Cont, input: Input[Array[Byte]] = Empty, received: Int = 0) extends Iteratee[Array[Byte], Either[Result, Int]] {
08 println(state + " " + input + " " + received) …Run Code Online (Sandbox Code Playgroud) apache-camel ×1
architecture ×1
backbone.js ×1
iterate ×1
java ×1
jboss ×1
jms ×1
scala ×1
spring ×1