该项目是使用编写的Play framework
and Scala
语言。
我已经实施了compile time dependency
。
我按照 Play 中的这个例子进行操作:
https://github.com/playframework/play-scala-compile-di-example https://github.com/playframework/play-scala-compile-di-example
看着MyApplicationLoader.scala
:
import play.api._
import play.api.routing.Router
class MyApplicationLoader extends ApplicationLoader {
private var components: MyComponents = _
def load(context: ApplicationLoader.Context): Application = {
components = new MyComponents(context)
components.application
}
}
class MyComponents(context: ApplicationLoader.Context)
extends BuiltInComponentsFromContext(context)
with play.filters.HttpFiltersComponents
with _root_.controllers.AssetsComponents {
lazy val homeController = new _root_.controllers.HomeController(controllerComponents)
lazy val router: Router = new _root_.router.Routes(httpErrorHandler, homeController, assets)
}
以及以下代码行:
lazy val homeController = new _root_.controllers.HomeController(controllerComponents)
我的理解是只有一个实例HomeController
第一次创建HomeController
叫做。
只要应用程序存在,该实例就会存在。这些说法正确吗?
The HomeController
在我的应用程序中看起来像这样:
class HomeController{
val request = // some code here
val workflowExecutionResult = Workflow.execute(request)
}
So Workflow
属于类型object
并不是class
.
The Workflow
看起来像这样:
object Workflow {
def execute(request: Request) = {
val retrieveCustomersResult = RetrieveCustomers.retrieve()
// some code here
val createRequestResult = CreateRequest.create(request)
// some code here
workflowExecutionResult
}
}
So Workflow
调用一些领域服务,每个领域服务都有类型object
并不是class
。
域服务内的所有值都是不可变的,我正在使用val
到处都是。
这足以保证线程安全吗?
我问是因为我习惯写作C# Web APIs
其中一个HomeController
看起来像这样:
class HomeControllerInSeeSharpProject{
// some code here
var request = new Request() // more code here
var workflow = new WorkflowInSeeSharpProject()
var workflowExecutionResult = workflow.execute(request)
}
and a Workflow
看起来像这样:
public class WorkflowInSeeSharpProject {
public execute(Request request) {
var retrieveCustomers = new RetrieveCustomers()
var retrieveCustomersResult = retrieveCustomers.retrieve()
// some code here
var createRequest = new CreateRequest()
var createRequestResult = createRequest.create(request)
// some code here
return workflowExecutionResult
}
}
所以在 C# 项目中每次HomeControllerInSeeSharpProject
被称为一个新实例WorkflowInSeeSharpProject
已创建并且所有域服务
也是更新的,然后我可以确定状态不能在单独的线程之间共享。所以我担心因为我的Scala
Workflow
域服务的类型为object
并不是class
可能存在这样的情况:两个请求被发送到HomeController
并且状态在这两个线程之间共享。
可以这样吗?我的应用程序不是线程安全的吗?
我读过object
Scala 中的 s 不是线程安全的,因为它们只有单个实例。不过我也读过,虽然
它们不是线程安全的val
s 将使应用程序线程安全......
或者可能Play
本身有办法解决这个问题吗?