我正在我的项目中实现依赖注入。我发现有两种方法可以添加单例服务:
services.AddSingleton(new MyCustomService())
并且
services.AddSingleton<MyCustomService>()
两种方法都似乎可行。这两种方法的区别是什么,我应该使用哪一种方法?
我正在我的项目中实现依赖注入。我发现有两种方法可以添加单例服务:
services.AddSingleton(new MyCustomService())
services.AddSingleton<MyCustomService>()
.AddSingleton<TService>()
方法(以及 .AddSingleton<TService, TImplementation>()
)时,类型由容器创建、控制和处理。如果构造函数包含其他依赖项,则这些依赖项会自动注入(一种称为“自动装配”的技术)。.AddSingleton<TService>(TService)
提供的实例已经存在。在这种情况下,当实现了 IDisposable
或 IAsyncDisposable
时,容器不会处理该实例。您需要自行处理该实例的处理。.AddSingleton<TService>(TService)
提供了一个已经存在的实例,因此容器无法注入任何依赖项,因为为了做到这一点,它也必须创建该实例。.AddSingleton<TService>(Func<TService>)
方法注册实例时,Func<TService>
委托控制依赖项的创建,但委托返回的实例仍然由容器跟踪和处理。AddSingleton<TService>(IServiceCollection, TService)
扩展方法,在第二个示例中使用AddSingleton<TService>(IServiceCollection)
。TService
实例的时间。在第一个示例中 - 注册时创建它。在第二个示例中 - 它将在第一次请求时由容器创建。MyCustomService
可能具有其他依赖项,则我想AddSingleton<TService>(IServiceCollection)
可能更方便。
.AddSingleton<TService>(Func<IServiceProvider,TService>)
怎么样?我猜想使用该方法时,类型也会由容器创建、控制和处理。这是正确的吗?即使我使用显式的new
,例如services.AddSingleton<MyCustomService>(_ => new MyCustomService())
,对吗? - Joerg