scala – 如何使用Kleisli实现缓存
发布时间:2020-12-16 18:31:34 所属栏目:安全 来源:网络整理
导读:我遵循了功能和反应建模一书中的设计原则. 所以所有的服务方法都归功于Kleisli. 问题是如何在这些服务上添加可更新缓存. 这是我目前的实现,有更好的方法(现有组合器,更多功能方法,……)? import scala.concurrent.duration.Durationimport scala.concurrent
我遵循了功能和反应建模一书中的设计原则.
所以所有的服务方法都归功于Kleisli. 问题是如何在这些服务上添加可更新缓存. 这是我目前的实现,有更好的方法(现有组合器,更多功能方法,……)? import scala.concurrent.duration.Duration import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{Await,Future} import scalaz.Kleisli trait Repository { def all : Future[Seq[String]] def replaceAll(l: Seq[String]) : Future[Unit] } trait Service { def all = Kleisli[Future,Repository,Seq[String]] { _.all } def replaceAll(l: Seq[String]) = Kleisli[Future,Unit] { _.replaceAll(l) } } trait CacheService extends Service { var cache : Seq[String] = Seq.empty[String] override def all = Kleisli[Future,Seq[String]] { repo: Repository => if (cache.isEmpty) { val fcache = repo.all fcache.foreach(cache = _) fcache } else Future.successful(cache) } override def replaceAll(l: Seq[String]) = Kleisli[Future,Unit] { repo: Repository => cache = l repo.replaceAll(l) } } object CacheTest extends App { val repo = new Repository { override def replaceAll(l: Seq[String]): Future[Unit] = Future.successful() override def all: Future[Seq[String]] = Future.successful(Seq("1","2","3")) } val service = new CacheService {} println(Await.result(service.all(repo),Duration.Inf)) Await.result(service.replaceAll(List("a"))(repo),Duration.Inf) println(Await.result(service.all(repo),Duration.Inf)) } [更新]关于@timotyperigo的评论,我在存储库级别实现了缓存 class CachedTipRepository(val self:TipRepository) extends TipRepository { var cache: Seq[Tip] = Seq.empty[Tip] override def all: Future[Seq[Tip]] = … override def replace(tips: String): Unit = … } 我仍然对改进设计的反馈感兴趣. 解决方法
Timothy完全正确:缓存是存储库(而不是服务)的实现功能.实施功能/细节不应在合同中公开,此时您的设计也很好(不过您的实施方式!)
深入研究设计问题,看看如何在Scala中完成依赖注入是很有趣的: >构造函数注入 蛋糕模式和构造函数注入有一个相似之处:依赖关系在创建时绑定.使用Reader monad(Kleisli只是在它上面提供了一个额外的层),你延迟绑定,这导致更多的可组合性(由于组合器),更多的可测试性和更多的灵活性 如果通过添加缓存功能来装饰现有的TipRepository,可能不需要Kleisli的好处,甚至可能使代码更难阅读.使用构造函数注入似乎是合适的,因为它是最简单的模式,让你“做得好” (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- angularjs – 用textarea和键盘显示离子模态的正
- AngularJS:简单的模糊功能
- angular – Set-Cookie在浏览器中不起作用,但与P
- 1.2、Bootstrap V4自学之路------起步---下载
- 如何在Scala中找到两个字符串中最长的公用前缀?
- less – 使用Compass内联Bootstrap SASS图像
- angularjs – CORS预检请求在Azure托管的Web API
- WebService 401 unauthorized 授权认证错误
- 如何在Vim或Linux中将空格转换为制表符?
- angularjs – Angular.js对象中的函数参数名称如
热点阅读