我使用蛋糕模式实现了一个电子邮件服务。下面是EmailComponent,它提供了电子邮件正文样式的功能:
trait EmailComponent {
def body: Body
trait Body {
def style(content Html): Html
}
}
trait DefaultEmailComponent extends EmailComponent {
def body = new DefaultBody
class DefaultBody extends Body {
views.html.email(content)
}
}..。下面是使用EmailServiceComponent实现电子邮件服务的EmailComponent
trait EmailServiceComponent {
def emailService: EmailService
trait EmailService {
def sendEmail(from: String, recipients: Seq[String], subject: String, content: Html)
}
}
trait DefaultEmailServiceComponent extends EmailServiceComponent {
this: EmailComponent =>
def emailService = new DefaultEmailService
class DefaultEmailService extends EmailService {
def sendEmail(from: String, recipients: Seq[String], subject: String, content: Html) {
val htmlBody = body.style(content)
EmailHelper.sendEmail(from, recipients, Some(subject), (None, Some(htmlBody)))
}
}上面的代码很好..。但当我看到MacWire时,我正在网上冲浪。我到处阅读一些文档,发现很有趣,但老实说,我还没有完全理解如何使用它,以及它是如何工作的。尽管如此,我如何才能用MacWire重新实现上面的示例呢?
发布于 2013-12-28 21:37:41
有几件事需要考虑:
Default...实现必须超出它们的父特性。wire[DefaultEmailService]而不是wire[EmailService]。因此,使用MacWire,您的代码将只是使用其他类的类,如
class DefaultEmailComponent extends EmailComponent { ... }
class DefaultEmailService(emailComponent: EmailComponent) extends EmailService { ... }
trait EmailServiceComponent {
def emailService: EmailService
}
class DefaultEmailServiceComponent(val emailService: EmailService)
extends EmailServiceComponent { ... }
lazy val emailC: EmailComponent = wire[DefaultEmailComponent]
lazy val emailSvc: EmailService = wire[DefaultEmailService]
lazy val emailSvcC: EmailServiceComponent = wire[DefaultEmailServiceComponent]https://stackoverflow.com/questions/20816901
复制相似问题