2016-04-20 88 views
3

我习惯于像Ruby on Rails或Laravel这样的框架,其中我有像User这样的模型,并且当我想对模型进行查询时(例如,获取所有用户在数据库中)我做了类似User::all()Scala对象:作为DAO的Scala对象

我是Play for Scala和Slick的新手,我已经看到的所有项目和文档都使用DAO通过模型访问数据库。我以为Scala object是我需要的(或者至少我习惯于),所以我不需要在任何地方注入DAO类。

随着DAO我做这样的事情:

class Application @Inject()(adminDAO: AdminDAO) extends Controller { 
    def index = Action.async { 
    adminDAO.all() map { case admins => 
     Ok(Json.toJson(admins)) 
    } 
    } 
} 

而且与对象(和不知道),我希望做这样的事情:

class Application extends Controller { 
    def index = Action.async { 
    Admin.all() map { case admins => 
     Ok(Json.toJson(admins)) 
    } 
    } 
} 

试图执行“DAO “object我发现几乎不可能注入播放Application上下文而不使用Play.current已弃用。这种贬低以及缺乏注入背景的方式(或者至少我没有发现它)听起来很奇怪。我开始认为我在想它是错误的。作为DAO使用Scala object真的是个好主意吗?

+0

你也可以看看[Anorm](https://www.playframework.com/documentation/2.5.x/ScalaAnorm)。 – cchantep

回答

3

它涉及到依赖注入(DI)与硬编码依赖关系。你的第一个例子使用DI,第二个例子硬编码对Admin DAO的依赖。该游戏团队已经决定与DI去在最近的版本在努力消除全球状态(讨论为什么全局状态是一件坏事看到here for example):

播放现在,开箱即用,使用依赖性注射由Guice提供。 这是一个从 Play中删除全球状态的长期策略的一部分,我们希望在Play 3.0版本中完成。

Source

因此,正确的方式,当谈到玩就是你们的榜样1,使用对象,因此一个硬编码的依赖确实是基于你对战的工作其实不可取纯(但是DI有很多优点)。

我不熟悉Ruby,但据我所知,DI与框架(如Guice),因为它在Java/Scala中并不需要,因为Ruby具有某些语言功能来解决不同的问题,这可能是为什么你想知道这一切的全部。我建议你在Java/Scala环境中阅读一些关于依赖注入的知识,它应该清楚它如何工作,它解决了什么问题,以及(缺点)优点是什么(因为你知道Ruby,为什么它不需要Ruby以同样的方式)。

想实现我发现几乎是不可能的“道”对象 不使用Play.current 它被废弃注入播放应用程序上下文。这种贬低和注入上下文(或者至少我没有找到它)的方式 声音 听起来很陌生。

您应该能够简单地将应用程序上下文注入到您的DAO中,例如,像这样:

class AdminDao @Inject()(val application : Application) { 

然后你有应用程序可用。这相当于已弃用

val application = Play.current 

在这两种情况下,您都会捕获正在运行的Application。它背后的依赖注入框架都确保递归解决依赖关系,即当你依赖于控制器中的DAO时,它会注意到DAO本身依赖于应用程序。它解析应用程序,将其注入到一个新的DAO实例中,并最终将其注入到您的控制器中。

最后但并非最不重要的方式导致像往常一样的罗马:也许ActiveSlick是你觉得有用的东西(免责声明:自己没有尝试过)。

+0

感谢第一部分的澄清(DI与全局状态),但在响应的第二部分,问题在于我需要Scala对象内的'Application'上下文,所以我没有任何构造函数可用于注入依赖项。使用'class'的DAO完全没有问题。你会如何解决它? – soutoner

+0

您不想使用对象,因为您再次使用全局状态( - >依赖于它的所有类都使用了一个DAO实例)。你需要一个类,这样框架为依赖它的每个类生成单独的DAO实例 - >没有更多的全局状态。在游戏环境中,DI带有整个类构造器注入模式,就像写作(我同意这里)一样。注入对象根本不起作用,因为框架无法生成实例并解决依赖关系。 – alextsc

+0

完美!感谢你的深刻反应,我将使用类作为DAO,因为它是Play的首选方式。 – soutoner