使用静态类而不是客户端工厂或依赖注入与杜松子酒?

时间:2013-08-22 07:44:57

标签: gwt dependency-injection static-methods gin

在GWT MVP中,我的演示者通常有很多私有成员(事件总线,rpc,使用GWT.create()创建的消息包...)。我们一直使用“ClientFactory”将视图生成为单例,因此每次需要时都不会重新创建它们。该工厂还可以提供rpc,事件总线和其他资源。

我可以在GWT doc中阅读the main purpose of this factory is to gain access to object needed through your application. The second advantage of using a ClientFactory is that you can use it with GWT deferred binding to use different implementation classes based on user.agent or other properties.

我的问题是:如果我没有,并且永远不需要使用延迟绑定对该工厂进行不同的实现,我不能只使用静态类&检索我的依赖项而不是客户端工厂或Gin 的方法? 我不能真正抓住Gin优于这个解决方案的优势,也不能让我在某些情况下/在某些(不明显的)环境下遇到麻烦。我通常会避免服务器端代码中的静态类,因为它是多线程的,但在客户端单线程代码中,我看不到问题可能发生的地方。然而,似乎大多数人使用杜松子酒或其他解决方案...

1 个答案:

答案 0 :(得分:3)

static的问题不在于线程,而在于全局状态和单身。

在GWT中使用MVP的一个主要原因是能够在不需要GWTTestCase的情况下测试您的演示者,因为它们不会直接依赖于GWT.create()或JSNI,两者都需要浏览器环境运行(注意GWT.create()普通Java 中变得可用,而某些项目(如gwt-mockito或gwt-test-utils)使用字节码操作无论如何让它运行)。但即使没有MVP,这仍然是一个问题:

测试时,全球各州和单身人士都会挡路:

  • 您的测试不是孤立的(它们取决于全局状态,因此两个同时运行的测试共享相同的状态,因此它们不在受控环境中运行
  • 你不能使用模拟/伪造/存根或其他测试双打,因为被测系统直接使用单例而不是依赖于环境传递的某些对象(在测试和生产中不同)

请参阅http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/