属性 注入 Microsoft.Extensions.DependencyInjection
Property Injection in Microsoft.Extensions.DependencyInjection
我对使用 DI 容器还比较陌生,遇到了一些障碍。
SimpleInjector 有一个具有以下签名的方法:
Container.RegisterInitializer<TService>(Action<TService>)
在我们的代码库中,我们确实是这样使用它的:
// this is a property injection of the abstract file system
container.RegisterInitializer<IFileSystemInjection>(
fs => fs.FileSystem = new FileSystem());
我想知道如何在 Startup.cs class 的 ConfigureServices 方法中使用 IServiceCollection 参数实现相同的目的。到目前为止,我已经能够使用 services.AddTransient(); 注册我所有的类型。但我不确定 IServiceCollection 中的等效 simpleinjector.RegisterInitializer 是什么。
您将使用 AddSingleton
、AddScoped
和 AddTransient
的工厂重载。我不确定 IFileSystemInjection
应该在什么范围内,但它 听起来 可能是一个单例。如果不是,请适当更改您调用的方法:
service.AddSingleton<IFileSystemInjection>(p =>
{
var fs = new FileSystemInjection();
fs.FileSystem = new FileSystem();
});
简而言之,如果您提供一个工厂,那么您将负责整个对象的初始化,因此 new FileSystemInjection()
,我将其替换为您使用的 IFileSystemInjection
的实际实现.
如果该实现具有需要注入的依赖项才能创建它,您可以从 p
中提取这些依赖项,这是 IServiceProvider
:
的一个实例
var myDep = p.GetRequiredService<MyDep>();
var fs = new FileSystemImplementation(myDep);
我对使用 DI 容器还比较陌生,遇到了一些障碍。
SimpleInjector 有一个具有以下签名的方法:
Container.RegisterInitializer<TService>(Action<TService>)
在我们的代码库中,我们确实是这样使用它的:
// this is a property injection of the abstract file system
container.RegisterInitializer<IFileSystemInjection>(
fs => fs.FileSystem = new FileSystem());
我想知道如何在 Startup.cs class 的 ConfigureServices 方法中使用 IServiceCollection 参数实现相同的目的。到目前为止,我已经能够使用 services.AddTransient(); 注册我所有的类型。但我不确定 IServiceCollection 中的等效 simpleinjector.RegisterInitializer 是什么。
您将使用 AddSingleton
、AddScoped
和 AddTransient
的工厂重载。我不确定 IFileSystemInjection
应该在什么范围内,但它 听起来 可能是一个单例。如果不是,请适当更改您调用的方法:
service.AddSingleton<IFileSystemInjection>(p =>
{
var fs = new FileSystemInjection();
fs.FileSystem = new FileSystem();
});
简而言之,如果您提供一个工厂,那么您将负责整个对象的初始化,因此 new FileSystemInjection()
,我将其替换为您使用的 IFileSystemInjection
的实际实现.
如果该实现具有需要注入的依赖项才能创建它,您可以从 p
中提取这些依赖项,这是 IServiceProvider
:
var myDep = p.GetRequiredService<MyDep>();
var fs = new FileSystemImplementation(myDep);