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

con*_*att 5 asp.net dependency-injection .net-core asp.net-core

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

dja*_*ski 6

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

// 使它更方便的好方法是添加扩展方法IServiceCollection,例如

public static T Resolve<T>(this IServiceProvider serviceProvider)
{
    return (T) serviceProvider.GetService(typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话 s.Resolve<IMyAssistantClass>();

  • 我建议使用 [`GetRequiredService&lt;T&gt;`](https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.serviceproviderserviceextensions.getrequiredservice?view=aspnetcore-2.1#Microsoft_Extensions_DependencyInjection_ServiceProviderServiceExtensions_Get_RequiredService_System forServiceProvider_System 代替两个原因:1. 它是通用的,所以不需要强制转换和 `typeof` 和 2. 如果没有找到依赖,它是快速失败的。 (5认同)
  • 在“IServiceProvider”上已经有通用的扩展方法。@KirkLarkin 指出了`GetRequiredService&lt;T&gt;()`,如果它没有解决,它会抛出一个异常。还有`GetService&lt;T&gt;()`,如果它没有解析,它会返回null。这些扩展方法位于“Microsoft.Extensions.DependencyInjection”命名空间中。 (4认同)

Ste*_*ven 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)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式注册:

services.AddSingleton<IMyAssistantClass, MyAssistantClass);
services.AddSingleton<MyClassManager>();
services.AddSingleton(new MyClassManagerSettings("myConnectionString"));
Run Code Online (Sandbox Code Playgroud)