依赖注入,注入参数

Ole*_*iak 31 c# dependency-injection asp.net-core-mvc asp.net-core

我正在使用DI的vNext实现.如何将参数传递给构造函数?例如,我有课:

public class RedisCacheProvider : ICacheProvider
{
    private readonly string _connectionString;

    public RedisCacheProvider(string connectionString)
    {
        _connectionString = connectionString;
    }
    //interface methods implementation...
}
Run Code Online (Sandbox Code Playgroud)

和服务注册:

services.AddSingleton<ICacheProvider, RedisCacheProvider>();
Run Code Online (Sandbox Code Playgroud)

如何将参数传递给RedisCacheProvider类的构造函数?例如Autofac:

builder.RegisterType<RedisCacheProvider>()
       .As<ICacheProvider>()
       .WithParameter("connectionString", "myPrettyLocalhost:6379");
Run Code Online (Sandbox Code Playgroud)

Kév*_*let 68

您可以提供委托来手动实例化缓存提供程序,也可以直接提供实例:

services.AddSingleton<ICacheProvider>(provider => new RedisCacheProvider("myPrettyLocalhost:6379"));

services.AddSingleton<ICacheProvider>(new RedisCacheProvider("myPrettyLocalhost:6379"));
Run Code Online (Sandbox Code Playgroud)

  • 别忘了您的服务是否采用了您已注册的其他参数,可以在注册时将引用传递给您的服务。例如,如果“ RedisCacheProvider”也需要ISomeService,则可以执行以下操作:services.AddSingleton &lt;ICacheProvider&gt;(provider =&gt; new RedisCacheProvider(“ myPrettyLocalhost:6379”,provider.GetService &lt;ISomeService&gt;())); (7认同)
  • @KévinChalet 如果您在答案中指定“手动实例化类型”*仅*关于通过“AddSingleton&lt;T&gt;(T)”注册类型,那就太好了。从注册委托返回的类型(例如使用“AddSingleton&lt;T&gt;(Func&lt;IServiceProvider, T&gt;)”)实际上将被丢弃。 (3认同)
  • 如果我有 ICacheProvider 的另一个实现,我该如何处理这个问题? (2认同)

fee*_*per 19

如果构造函数还具有应由 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...
}

Run Code Online (Sandbox Code Playgroud)

启动.cs:

services.AddSingleton<IMyInterface, MyInterface>();
services.AddSingleton<ICacheProvider>(provider => 
    RedisCacheProvider("myPrettyLocalhost:6379", provider.GetService<IMyInterface>()));
Run Code Online (Sandbox Code Playgroud)


Rah*_*Jha 13

您可以使用类似于下面示例代码的内容。

经理类:

public class Manager : IManager
{
    ILogger _logger;
    IFactory _factory;
    public Manager(IFactory factory, ILogger<Manager> logger)
    {
        _logger = logger;
        _factory = factory;
    }
}
Run Code Online (Sandbox Code Playgroud)

Startup.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);
    });
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读完整示例:.Net Core 中 Startup.cs 中的 DI


小智 8

您可以使用 :

 services.AddSingleton<ICacheProvider>(x =>
      ActivatorUtilities.CreateInstance<RedisCacheProvider>(x, "myPrettyLocalhost:6379"));
Run Code Online (Sandbox Code Playgroud)

依赖注入:ActivatorUtilities 将向您的类注入任何依赖项。