为服务层选择哪个服务生命周期

Dar*_*nce 3 c# asp.net-core

尝试了解哪种服务生命周期最适合服务层瞬态或范围(为什么)。我正在寻找使用范围作为服务层而不是瞬态的优点和缺点。瞬态服务是否可以与数据库事务配合良好,或者将服务层保留在范围内并不是一件好事。谢谢

pok*_*oke 6

通常,您应该默认为瞬态生命周期。这些很容易理解,并且通常会阻止您在服务中保留状态。它\xe2\x80\x99s 也是与其他服务最兼容的生命周期,因为它可以在任何地方使用。所以除非你有一定的要求,否则默认选择transient即可。

\n\n

当您有昂贵的操作或应在请求期间保留的临时状态时,范围服务是很好的选择。数据库连接就是一个很好的例子,因为数据库连接并不是超级便宜,并且使用单个连接来处理单个用户的单个请求(这不是同时发生的)效果很好。其他示例将在请求数据之上进行计算,例如从有关用户的外部源检索的数据(尽管在这里您甚至可能会考虑寿命更长的缓存)。

\n\n

如果您不是自己创建数据库连接,则很可能您已经拥有一些服务,您需要通过这些服务才能使用数据库。希望该服务已注册为范围服务。Entity Framework Core 中的一个示例是DbContext默认情况下将注册为范围依赖项。

\n\n

如果您使用此类服务​​,则可以从临时服务中使用它们。多个(暂时的)服务最终将接收同一个实例。但是,\xe2\x80\x99 是你的服务不应该关心的实现细节。因此,默认建议仍然有效:将服务注册为瞬态服务。

\n\n

在决定瞬态还是作用域时,考虑以下问题也是一个好主意:在处理单个请求期间服务是否会多次解析?每次创建单独的实例是否存在问题(例如,这是一个昂贵的操作)?那么选择一个有范围的生命周期可能会对您有所帮助。

\n