如何在ASP.NET Core v2中传递一个字符串和注入的依赖项

6

我在我的ASP.NET Core v2项目的Startup.cs类中有以下方法。我的问题是如何设置一个类/服务,其中传递一个字符串值到一个类,同时注入依赖项。

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add custom services.
        services.AddSingleton<IMyAssistantClass, MyAssistantClass);
        services.AddSingleton<MyClassManager>(s => new  MyClassManager("connectionString", /* How to inject IMyAssistantClass? */);

        // Other setup....
    }
2个回答

7
public void ConfigureServices(IServiceCollection services)
{
  services.AddSingleton<IMyAssistantClass, MyAssistantClass);
  services.AddSingleton<MyClassManager>(s => 
    {
      var imy = (IMyAssistantClass) s.GetService(typeof(IMyAssistantClass))
      new  MyClassManager("connectionString", imy);
    }
  );
}

// 让它更加方便的好方法是在IServiceCollection上添加扩展方法,如下所示

public static T Resolve<T>(this IServiceProvider serviceProvider)
{
    return (T) serviceProvider.GetService(typeof(T));
}

然后你只需要调用 s.Resolve<IMyAssistantClass>();


7
我建议使用GetRequiredService<T>有两个原因:1.它是通用的,所以不需要转换和typeof;2.如果找不到依赖项,它会立即失败。 - Kirk Larkin
5
IServiceProvider中已经有通用的扩展方法。@KirkLarkin指出了GetRequiredService<T>(),如果无法解析,则会引发异常。还有GetService<T>(),如果无法解析,则返回null。这些扩展方法位于Microsoft.Extensions.DependencyInjection命名空间中。 - Brad

5
connectionString变量提升为参数对象,并将此对象注册到容器中:
public class MyClassManagerSettings
{
    public readonly string ConnectionString;

    public MyClassManagerSettings(string connectionString) {
        this.ConnectionString = connectionString
            ?? throw new ArgumentNullException(nameof(connectionString));
    }
}

public class MyClassManager
{
    public MyClassManager(
        MyClassManagerSettings settings, IMyAssistantClass assistant)
    {
        ...
    }
}

您可以按照以下方式进行注册:
services.AddSingleton<IMyAssistantClass, MyAssistantClass);
services.AddSingleton<MyClassManager>();
services.AddSingleton(new MyClassManagerSettings("myConnectionString"));

这绝对是首选的方法。在我看来,您应该避免向依赖注入的类添加参数。为了补充这个答案,我建议使用IConfiguration,然后让您的启动程序从appsettings中加载(GetSection)连接字符串。然后,您可以将配置注入到ServiceCollection中以获取连接字符串。 - Kent Kostelac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接