- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
该项目是使用 Play framework
编写的和 Scala
语言。
我已经实现了compile time dependency
.
我从 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
叫做。
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
}
}
HomeControllerInSeeSharpProject
被称为
WorkflowInSeeSharpProject
的新实例已创建并且所有域服务
Scala
Workflow
和域服务的类型为
object
而不是
class
可能会出现两个请求被发送到
HomeController
的情况。
object
Scala 中的 s 不是线程安全的,因为它们只有一个实例。但是我也读过,虽然
val
它们不是线程安全的s 将使应用程序线程安全...
Play
本身有办法处理那个问题吗?
最佳答案
因为您使用的是编译时依赖注入(inject),所以您可以控制创建的实例数,在您的情况下为 HomeController
只创建一次。随着请求的到来,这个单一实例将在线程之间共享,因此您确实必须确保它是线程安全的。 HomeController
的所有依赖还需要是线程安全的,因此 object Workflow
必须是线程安全的。目前,Workflow
不公开公开任何共享状态,因此它是线程安全的。一般情况下,val
object
中的定义是 thread-safe .
有效HomeController
表现得像一个单例,避免单例可能更安全。例如,默认情况下 Play Framework 使用 Guice依赖注入(inject),只要不是 @Singleton
,每个请求都会创建一个新的 Controller 实例.一个动机是,正如 Nio's answer 所建议的那样,关于并发保护的担忧更少。 :
In general, it is probably best to not use @Singleton unless you have a fair understanding of immutability and thread-safety. If you think you have a use case for Singleton though just make sure you are protecting any shared state.
关于multithreading - 玩 Scala 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619826/
我是一名优秀的程序员,十分优秀!