我想在ASP.NET Core中实现依赖注入(DI)。因此,在将此代码添加到ConfigureServices方法后,这两种方法都可以工作。
ASP.NET Core中的services.AddTransient和service.AddScoped方法之间有什么区别?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
在.NET的依赖注入中,有三个主要的生命周期:
在整个应用程序中创建单个实例的Singleton。它第一次创建实例,并在所有调用中重用相同的对象。
作用域内的每个请求创建一次作用域生存期服务。它相当于当前范围中的单例。例如,在MVC中,它为每个HTTP请求创建一个实例,但在同一web请求中的其他调用中使用相同的实例。
每次请求时都会创建短暂的生命周期服务。这种生命周期最适合于轻量级、无状态服务。
在这里,您可以找到和示例来了解不同之处:
ASP.NET 5 MVC6依赖注入,分6个步骤进行(由于链接无效,导致web存档链接)
依赖项注入就绪的ASP.NET:ASP.NET 5
这是官方文件的链接:
ASP.NET核心中的依赖注入
在.NET的依赖注入中,有三个主要的生命周期:
在整个应用程序中创建单个实例的Singleton。它第一次创建实例,并在所有调用中重用相同的对象。
作用域内的每个请求创建一次作用域生存期服务。它相当于当前范围中的单例。例如,在MVC中,它为每个HTTP请求创建一个实例,但在同一web请求中的其他调用中使用相同的实例。
每次请求时都会创建短暂的生命周期服务。这种生命周期最适合于轻量级、无状态服务。
在这里,您可以找到和示例来了解不同之处:
ASP.NET 5 MVC6依赖注入,分6个步骤进行(由于链接无效,导致web存档链接)
依赖项注入就绪的ASP.NET:ASP.NET 5
这是官方文件的链接:
ASP.NET核心中的依赖注入
通过DbContext使用EntityFramework/Core可能是生命周期的最佳说明。
建议将DbContext和与DbContext交互的存储库连接到Scoped生存期,因为DbContext显然是一个有状态的构造。所以你不想使用Singleton,因为你最终会遇到各种并发问题。您不想使用Transient,因为DbContext不是线程安全的。记住,Transient适用于处理无状态对象/类的用例。
而且,由于大多数存储库都是由控制器调用的,所以使用作用域生存期确实很有意义。可以想象,作为事务的一部分,DbContext可以在单个操作方法期间多次调用。
本文没有直接讨论这些生存期,但对为什么Scoped生存期最适合DbContext给出了很好的解释。
https://mehdi.me/ambient-dbcontext-in-ef6/?msclkid=00251b05d01411ec8d85d232374f26d5