该项目使用
我的理解是,在第一次调用 HomeController 时,只会创建一个实例。 而且这个实例的生命周期跟应用程序相同。这些说法正确吗?
我的应用程序中的 HomeController 如下所示:
在C#项目中,每次调用
这种情况是否可能发生?我的应用程序是否不安全?
我已经了解到,在Scala中,
或者,
Play框架
和Scala语言
编写。
我实现了编译时依赖
。
我按照Play的这个例子进行操作:
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 如下所示:
class HomeController{
val request = // some code here
val workflowExecutionResult = Workflow.execute(request)
}
因此,Workflow
是一种类型为object
而不是class
的对象。
Workflow
的样子如下:
object Workflow {
def execute(request: Request) = {
val retrieveCustomersResult = RetrieveCustomers.retrieve()
// some code here
val createRequestResult = CreateRequest.create(request)
// some code here
workflowExecutionResult
}
}
所以 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)
}
一个 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
并且状态在这两个线程之间共享的情况。这种情况是否可能发生?我的应用程序是否不安全?
我已经了解到,在Scala中,
object
不是线程安全的,因为它们只有一个实例。然而,我也读到过,尽管它们不是线程安全的,使用val
可以使应用程序变得线程安全...或者,
Play
本身有处理这个问题的方法吗?