小编ggd*_*dio的帖子

用于层间通信的装饰器

我试图通过使用抽象模型和装饰器来实现用于层间通信的新架构方法.

传统上,当我们设计单片应用程序的层时,我们将拥有应用程序(控制器)层,域(业务)层和基础架构(持久性)层.这些层通过具体的模型定义相互通信,当从数据库中读取时,导航通过存储库,然后导航到服务,最后导航到将其分派给客户端的控制器.

那就是说,让我们谈谈......

通常,基础结构模型不能与业务模型相同,业务模型也不能与UI模型相同.基础架构模型可能仅涉及其目标存储库结构,域层可能仅涉及业务操作,并且UI层必须仅关注其客户端和数据读取/输入.

所有这些层必须"理解"彼此的抽象,或甚至实现双向值映射(或DTO的),以便在它们之间进行通信.映射/ DTO是一种糟糕的方法,因为我们会对数据映射进行不必要的处理.

所以,这就是我要做的事情:通过使用装饰器进行通信来分离图层.

在那种方法中,我们将在共享模块上具有抽象组件和它的装饰器,并且每个层都具有它自己的装饰器.

例如.:

  • AbstractFoo是一个抽象;
  • FooDecorator实现了AbstractFoo并且还包装了一个AbstractFoo;
  • FooEntity是一个实现FooDecorator并处理持久性内容的基础架构模型
  • FooBusiness是一种实现FooEntity装饰器和处理业务的商业模型
  • FooView是一个控制器模型,它实现了FooBusiness装饰器并处理UI字段,编码等...

通过这种方法,我们可以:

  • 内存中只有一个对象持有Foo信息,但每一层都"关注它自己的业务".
  • 将图层分隔在不同的模块中,因此业务仅导入infra,而app层仅导入业务.
  • 我们可以在不放弃我们的域的情况下分发用于哑逻辑的存根,例如必须只知道产品摘要的购物车服务,而不是域对象本身.
  • 我们可以让不同的团队在应用程序的不同层中工作而不会发生冲突.

这是一个纸上的例子:

草图

所以......我问的是建议,提示和一些意见,如果这是一个好方法.

[更新#1]:

为了简化我的问题,我将在下面发布一个用例:

共享组件:

// Abstract Foo
public abstract class AbstractFoo {
   protected Long id;
   protected String color;
   protected LocalDateTime lastModified;

   protected Long getId();
   protected String getColor();

   protected void setId();
   protected void setColor();
}


// Abstract Decorator(wraps foo)
public abstract class FooDecorator extends AbstractFoo {
   private final Foo foo;
   protected FooDecorator(Foo foo) { this.foo = foo; }

   protected Long …
Run Code Online (Sandbox Code Playgroud)

java architecture design-patterns domain-driven-design

4
推荐指数
1
解决办法
143
查看次数

SPRING - 获取当前范围

如何在Spring应用程序中访问当前的线程范围......

换句话说,如何识别当前线程范围是请求还是系统本地线程?

spring

3
推荐指数
1
解决办法
1777
查看次数