依赖注入,注入参数

本文关键字:注入 参数 依赖 | 更新日期: 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 注入一个工厂来创建和公开提供程序类的实例。