2016-03-17 13 views
1

Я следую за дизайн книги Функциональная и реактивная Моделирование областиКак уменьшить шаблонного с Клейсли

И для некоторых методов обслуживания, то только делегаты работают в хранилище слоя. Есть ли способ уменьшить этот шаблон:

trait FeedbackServiceImpl extends FeedbackService { 
    override def saveTFE(feedback: TripFeedbackEvent) = 
    Kleisli[Future, Context, Either[String, Id]] { ctx => ctx.feedbackRepo.save(feedback) } 

    override def saveLFE(feedback: LibraryFeedbackEvent) = 
    Kleisli[Future, Context, Either[String, Id]] { ctx => ctx.feedbackRepo.save(feedback) } 

    override def findByUser(userId: Id) = 
    Kleisli[Future, Context, Seq[FeedbackEvent]] { ctx => ctx.feedbackRepo.findByUser(userId) } 

    override def all = 
    Kleisli[Future, Context, Seq[FeedbackEvent]] { ctx => ctx.feedbackRepo.all } 

    override def findByTip(tipId: Id) = 
    Kleisli[Future, Context, Seq[FeedbackEvent]] { ctx => ctx.feedbackRepo.findByTip(tipId) } 

} 

ответ

0

Мы можем создать комбинатор:

private def kleisli[M[_], A](f: FeedbackRepository => M[A]) = Kleisli.kleisli(f).local[Context](_.feedbackRepo)

Следовательно мы получаем 2 вещи:

  • избежать объявления типа, помогая механизм типа логического вывода
  • избежать вызова ctx.feedbackRepo с помощью local

Таким образом, мы можем использовать:

trait Feedbacks { 
    def saveTFE(feedback: TripFeedbackEvent) = kleisli(_.save(feedback)) 
    def saveLFE(feedback: LibraryFeedbackEvent) = kleisli(_.save(feedback)) 
    def findByUser(userId: Id) = kleisli(_.findByUser(userId)) 
    ... 
} 
-1

Можете ли вы просто определить функцию, которая выполняет весь шаблон? Что-то вроде:

def repo2Kleisli[T](f: Repo => Future[T]): Kleisli[Future, Context, T] 

Вы могли бы даже сделать это неявное и уменьшить ваш код что-то вроде:

override def saveTFE(feedback: TripFeedbackEvent) = (repo: Repo) => repo.save(feedback) 

 Смежные вопросы

  • Нет связанных вопросов^_^