Ric*_*ich 11 spring dependency-injection guice playframework
我是依赖注入和Play框架的忠实粉丝,但我很难看到这两者如何被一起利用.
有Spring和Guice的模块,但Play的工作方式使我很难看到DI除了一些非常简单的情况之外如何有益.
一个很好的例子是Play期望JPA工作由与所讨论的实体相关联的静态方法完成:
@Entity
Person extends Model {
public static void delete(long id) {
em().find(id).remove();
}
//etc
}
Run Code Online (Sandbox Code Playgroud)
因此,不需要PersonManager像Spring J2EE应用程序那样将控制器注入控制器.相反,控制器只是调用Person.delete(x).
显然,当存在与外部系统的接口时,DI是有益的,因为具体的实现可以被模拟用于测试等,但是对于自包含的Play应用程序我没有看到太多的好处.
有没有人有任何好的例子?有没有人用它来将一个Manager-style类注入Controllers中,以便在同一个事务中完成许多操作,例如?
我相信你写的这句话:
"有没有人有任何好的例子?有没有人用它来向控制器注入一个经理风格的类,以便在同一个事务中可以完成许多操作,例如?"
在回答DI问题之前,我应该注意一些事情:交易由Play自动管理.如果检查模型文档,您将看到在请求开始时自动创建事务,并在结束时提交.您可以通过JPA回滚它,或者如果引发异常,它将被回滚.
我提到这一点是因为根据你的句子的措辞,我不确定你是否意识到这一点.
现在,在DI本身,在我(不那么广泛)的DI体验中,我发现它主要用于:
当然,还有更多场景,但这些可能涵盖了大多数实际使用情况.现在:
还有另一个需要考虑的问题:我对Guice不太确定,但Spring不仅仅是DI,它还提供了许多依赖于DI模块的额外功能.所以也许你不想在Play中使用DI,但是你想利用Spring工具,他们会使用DI,虽然是间接的(通过xml配置).
我对Play的静态初始化方法的拙见的问题!是因为它使测试更难.一旦您使用静态成员和带有HTTP消息数据(请求和响应)的对象来解决HTTP与对象方向问题,您就必须通过使您的对象与其余请求松散耦合的能力为每个请求创建新实例.您的项目类.
不同设计的一个很好的例子是servlet,它还扩展了一个基类,但它通过单个实例创建来解决问题(默认情况下,因为有一些配置可以启用更多实例).
我相信这两种方法的混合可能会更好,每个控制器的单例将提供完整静态类的相同特性,并允许依赖注入某些类型的对象.但是,一旦需要在每个新请求中创建控制器,就不会有具有请求或会话范围的对象.此外,它将通过反转依赖注入的控制来改善可测试性,从而允许任意注入点.
依赖性将由容器或测试注入,可能使用模拟来处理之前可能已经测试过的重物.
在我看来,这个静态模型推动开发人员远离测试控制器,因为扩展FunctionalTest启动应用服务器,从而支付重量级对象的价格,如存储库,服务,爬虫,http客户端等.我不想等待为了检查某些代码是否在控制器上执行,需要引导很多对象,测试应该快速而清晰,以使开发人员喜欢他们作为编程助手/指南.
| 归档时间: |
|
| 查看次数: |
4443 次 |
| 最近记录: |