什么时候实例化应用服务层class?

When to instantiate application service layer class?

我正在尝试将六边形架构应用于一个项目,该项目将有多个应用程序必须处理相同的域模型。

例如,我们将有一个 mvc 网站请求应用程序服务,然后处理域模型和数据访问层。目前一切正常。

我的问题是什么时候应该实例化应用程序服务class。对于所有用户(单例),我应该只有一个 class 的实例吗? 或者我应该为每个用户实例化一个,然后让它保存一些用户数据并存储在用户会话中? 或者我应该为每个请求实例化一个新的 class 吗?

当然,这些选项中的任何一个都是可能的,但我想获得您的最佳实践建议。

我想 class 越无状态越好,但是无状态 class 意味着我需要在每个我不太喜欢的方法调用中传递用户特定数据。

我通常将我的服务和持久性 类 保留在请求范围内。这有助于确保我可以在出现问题时恢复数据事务并且我没有留下部分数据。

至于为什么您不想要更持久的事务范围,这通常是提高性能的一种非常糟糕的方式,并且可能导致意外行为。特别是当涉及到依赖于瞬态或作用域 类 的单例时。因为单例既然创建了一次,那么它的依赖也就创建了一次。这对于非线程安全的 类 非常危险。 More on scopes here.

至于您对传递用户数据的担忧。我会将您关心的所有信息放在某种用户数据帮助界面后面。让您的服务依赖于它而不是传递该数据。然后您可以制作一个特定于您要支持的客户端的用户数据助手。您可以使用依赖项注入来配置您的 mvc 应用程序以使用该用户数据助手的 mvc 特定实现。您架构中的其他客户端也可以做同样的事情。

我会为用户信息助手编写一个自定义界面,以满足您现有服务的确切需求。自定义实现可以基于会话数据或您的客户可以提供的任何内容。也就是说,实现可能依赖于现有的库,但会将此数据转换为通用格式供您的服务层使用。这样你就可以在不破坏你的应用程序的其余部分的情况下交换你的用户信息来自帮助程序的位置。