依赖注入,注入参数
本文关键字:注入 参数 依赖 | 更新日期: 2023-09-27 18:30:51
我正在使用 DI 的 vNext 实现。如何将参数传递给构造函数?例如,我有类:
public class RedisCacheProvider : ICacheProvider
{
private readonly string _connectionString;
public RedisCacheProvider(string connectionString)
{
_connectionString = connectionString;
}
//interface methods implementation...
}
和服务注册:
services.AddSingleton<ICacheProvider, RedisCacheProvider>();
如何将参数传递给 RedisCacheProvider 类的构造函数?例如,对于Autofac:
builder.RegisterType<RedisCacheProvider>()
.As<ICacheProvider>()
.WithParameter("connectionString", "myPrettyLocalhost:6379");
您可以提供一个委托来手动实例化缓存提供程序,也可以直接提供一个实例:
services.AddSingleton<ICacheProvider>(provider => new RedisCacheProvider("myPrettyLocalhost:6379"));
services.AddSingleton<ICacheProvider>(new RedisCacheProvider("myPrettyLocalhost:6379"));
请注意,容器不会显式释放手动实例化的类型,即使它们实现了 IDisposable。有关详细信息,请参阅有关服务处置的 ASP.NET Core 文档。
如果构造函数也有应由 DI 解析的依赖项,则可以使用它:
public class RedisCacheProvider : ICacheProvider
{
private readonly string _connectionString;
private readonly IMyInterface _myImplementation;
public RedisCacheProvider(string connectionString, IMyInterface myImplementation)
{
_connectionString = connectionString;
_myImplementation = myImplementation;
}
//interface methods implementation...
}
启动.cs:
services.AddSingleton<IMyInterface, MyInterface>();
services.AddSingleton<ICacheProvider>(provider =>
RedisCacheProvider("myPrettyLocalhost:6379", provider.GetService<IMyInterface>()));
您可以使用:
services.AddSingleton<ICacheProvider>(x =>
ActivatorUtilities.CreateInstance<RedisCacheProvider>(x, "myPrettyLocalhost:6379"));
依赖注入:激活器实用程序会将任何依赖注入到您的类中。
以下是MS文档的链接:Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance
另:有关更多信息,请参阅此处@poke的回答。基本上,它从提供的服务和您传递的任何其他参数中提取,例如合成构造函数。
您可以使用类似于以下示例代码的内容。
经理类:
public class Manager : IManager
{
ILogger _logger;
IFactory _factory;
public Manager(IFactory factory, ILogger<Manager> logger)
{
_logger = logger;
_factory = factory;
}
}
启动.cs类:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFactory, Factory>(sp =>
{
var logger = sp.GetRequiredService<ILogger<Factory>>();
var dbContext = sp.GetRequiredService<MyDBContext>();
return new Factory(dbContext, logger);
});
services.AddTransient<IManager, Manager>(sp =>
{
var factory = sp.GetRequiredService<IFactory>();
var logger = sp.GetRequiredService<ILogger<Manager>>();
return new Manager(factory, logger);
});
}
您可以在此处阅读完整示例:启动中的 DI.cs在 .Net Core 中
聚会有点晚了,但你可以 DI 注入一个工厂来创建和公开提供程序类的实例。