域服务可以访问存储库吗?或者他们应该处理由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) 我Observable每秒都会发出一个滴答声:
Observable.interval(0, 1, TimeUnit.SECONDS)
.take(durationInSeconds + 1));
Run Code Online (Sandbox Code Playgroud)
我想暂停这个Observable,以便它停止发出数字,并按需恢复它.
有一些陷阱:
ObservableJavadoc,interval操作员不支持背压处理过度生产的Observable的另一种方法是阻止callstack(停止管理过度生产的Observable的线程).这具有违背Rx的"反应性"和非阻塞模型的缺点.但是,如果有问题的Observable位于可以安全阻止的线程上,这可能是一个可行的选择.目前,RxJava不会公开任何运营商来促进这一点.
有没有办法暂停一个intervalObservable?或者我应该用一些背压支持实现我自己的'滴答'Observable?
我正在玩monad变形金刚scalaz.我正在尝试将读取器顶部的Writer与底层Idmonad 堆叠在一起.为了组合它们,我正在使用MonadReader和MonadWriter输入类.
我设法编译并运行以下代码示例而没有编写器(即使用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) 我开始使用Emacs(目前仅用于org模式).我没有在我的TODO中使用优先级,因此我想禁用S-UP和S-DOWN键绑定(循环优先级).我怎样才能做到这一点?
在第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)