小编mgr*_*zko的帖子

域服务可以访问存储库吗?

域服务可以访问存储库吗?或者他们应该处理由Application Services传递给它们的聚合/实体?

考虑相同业务操作的两个代码示例 - 汇款.作为第一步,我改变账户余额.然后我获取通知电子邮件并发送通知.我知道,我应该抽象通知的发送方式(电子邮件,短信,信鸽),但为了简单起见,我们假设我们现在只支持电子邮件.

变体1使用域服务中的存储库.变体2解决了应用程序服务中的依赖关系并将它们传递给TransferDomainService.

在此示例中,操作很简单(从一个帐户中减去钱并将其添加到另一个帐户).但是如果涉及更多业务规则(可能需要访问更多聚合)?如果应用了变体2,那么应用程序服务必须知道域服务究竟需要什么.如果选择了变量1,则域服务会向存储库询问执行其任务所需的内容.

(关于代码片段的注释:用于删除Java冗余的Groovy代码.名称中包含DDD构建块)

变式1

class TransferApplicationService {
    def transferDomainService
    def customerDomainService
    def emailNotifierInfrastructureService

    def transfer(fromAccount, toAccount, amount) {
        transferDomainService.transfer(fromAccount, toAccount, amount)
        def email = customerDomainService.accountNotificationEmail(toAccount)
        emailNotifierInfrastructureService.notifyAboutTransfer(email, amount)
    }
}

class TransferDomainService {
    def accountRepository
    def transfer(fromAccount, toAccount, amount) {
        def from = accountRepository.findByNumber(fromAccount)
        def to = accountRepository.findByNumber(toAccount)
        to.decreaseBalance(amount)
        from.increaseBalance(amount)
    }
}
Run Code Online (Sandbox Code Playgroud)

变体2

class TransferApplicationService {
    def accountRepository
    def transferDomainService
    def customerDomainService
    def notifierInfrastructureService

    def transfer(fromAccount, toAccount, amount) {
        def from …
Run Code Online (Sandbox Code Playgroud)

domain-driven-design

14
推荐指数
1
解决办法
3127
查看次数

如何在不丢失物品的情况下暂停Observable?

Observable每秒都会发出一个滴答声:

Observable.interval(0, 1, TimeUnit.SECONDS)
    .take(durationInSeconds + 1));
Run Code Online (Sandbox Code Playgroud)

我想暂停这个Observable,以便它停止发出数字,并按需恢复它.

有一些陷阱:

  • 根据ObservableJavadoc,interval操作员不支持背压
  • 关于背压的RxJava wiki 有一个关于Callstack阻塞的部分作为背压的流量控制替代方案:

处理过度生产的Observable的另一种方法是阻止callstack(停止管理过度生产的Observable的线程).这具有违背Rx的"反应性"和非阻塞模型的缺点.但是,如果有问题的Observable位于可以安全阻止的线程上,这可能是一个可行的选择.目前,RxJava不会公开任何运营商来促进这一点.

有没有办法暂停一个intervalObservable?或者我应该用一些背压支持实现我自己的'滴答'Observable?

rx-java reactivex

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

如何在scalaz中堆叠ReaderT和WriterT变换器?

我正在玩monad变形金刚scalaz.我正在尝试将读取器顶部的Writer与底层Idmonad 堆叠在一起.为了组合它们,我正在使用MonadReaderMonadWriter输入类.

我设法编译并运行以下代码示例而没有编写器(即使用Readermonad,即ReaderT[Id.Id, String, A]).在向WriterT堆栈添加时,我收到编译错误:

Gist.scala:10: could not find implicit value for parameter F: scalaz.MonadReader[Gist.R,String]
   val MR = MonadReader[R, String]
                       ^
Run Code Online (Sandbox Code Playgroud)

如何获取MonadReader变压器堆栈的实例?我是否必须使用ReaderWriterStateT或有其他方式吗?

完整代码:

import scalaz.{Id, MonadListen, MonadReader, ReaderT, WriterT}

object Gist {
  import scalaz.std.list._
  import scalaz.syntax.monad._

  type P[A] = ReaderT[Id.Id, String, A]
  type R[A] = WriterT[P, List[String], A]

  val MR = MonadReader[R, String]
  val MW = MonadListen[R, List[String]]

  def apply: …
Run Code Online (Sandbox Code Playgroud)

scala scalaz

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

组织模式 - 如何禁用一些键绑定?

我开始使用Emacs(目前仅用于org模式).我没有在我的TODO中使用优先级,因此我想禁用S-UPS-DOWN键绑定(循环优先级).我怎样才能做到这一点?

emacs org-mode

2
推荐指数
1
解决办法
207
查看次数

WriterT转换列表monad - 内部和外部monad如何协同工作?

在第181页的Beginning Haskell一书中,有一个WriterT用于包装Listmonad 的示例.下面的代码计算图表中的路径.请注意,这是一个非常简单的算法,不考虑循环).

type Vertex = Int
type Edge = (Vertex, Vertex)

pathsWriterT :: [Edge] -> Vertex -> Vertex -> [[Vertex]]
pathsWriterT edges start end = execWriterT (pathsWriterT' edges start end)

pathsWriterT' :: [Edge] -> Vertex -> Vertex -> WriterT [Vertex] [] ()
pathsWriterT' edges start end =
  let e_paths = do (e_start, e_end) <- lift edges
                   guard $ e_start == start
                   tell [start]
                   pathsWriterT' edges e_end end
   in if start == end
      then …
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
1
解决办法
202
查看次数