Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为服务层选择哪个服务生命周期_C#_Asp.net Core - Fatal编程技术网

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

C# 为服务层选择哪个服务生命周期,c#,asp.net-core,C#,Asp.net Core,试图了解哪个服务生命周期最适合服务层瞬态或作用域(为什么)。 我正在寻找使用作用域作为服务层而不是临时服务层的优缺点。瞬态服务是否能很好地处理数据库事务,或者保持服务层的作用域是不好的。 谢谢,通常情况下,您应该默认使用瞬时生存期。这些很容易理解,通常会阻止您在服务中保持状态。它也是与其他服务最兼容的生命周期,因为它可以在任何地方使用。因此,除非您有特定的需求,否则默认情况下只需选择transient 当您有昂贵的操作或在请求期间应保持的临时状态时,作用域服务是好的。数据库连接就是一个很好的例子

试图了解哪个服务生命周期最适合服务层瞬态或作用域(为什么)。 我正在寻找使用作用域作为服务层而不是临时服务层的优缺点。瞬态服务是否能很好地处理数据库事务,或者保持服务层的作用域是不好的。
谢谢,通常情况下,您应该默认使用瞬时生存期。这些很容易理解,通常会阻止您在服务中保持状态。它也是与其他服务最兼容的生命周期,因为它可以在任何地方使用。因此,除非您有特定的需求,否则默认情况下只需选择transient

当您有昂贵的操作或在请求期间应保持的临时状态时,作用域服务是好的。数据库连接就是一个很好的例子,因为数据库连接并不超级便宜,使用单个连接来处理单个用户的单个请求(不是同时发生的)效果非常好。其他示例将计算请求数据之上的数据,例如从外部来源检索的关于用户的数据(虽然这里您甚至可以考虑更长的活动缓存)。 如果您不是自己创建数据库连接,那么很可能您已经有了一些服务,您需要通过这些服务来使用数据库。然后希望该服务已经注册为作用域服务。例如,Entity Framework Core中的
DbContext
,默认情况下,它将注册为作用域依赖项

如果您使用这些服务,您可以从临时服务中使用它们。多个(暂时的)服务最终只会接收同一个实例。但这是一个实现细节,您的服务不应该为此烦恼。因此,默认建议仍然有效:将服务注册为transient


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

这可能太宽泛了,无法在这里得到一个好的答案;下面是一个关于服务生命周期的讨论,您可能会发现它很有用: