在IServiceCollection

时间:2018-10-24 21:27:00

标签: c# asp.net-core dependency-injection configuration

我们需要创建一个通用方法来获取服务的任何设置。我们为每个“服务”都有一个配置类,但是文件appsettings.json.

中的所有类都具有相同的“键”

一个常见的例子:

public abstract class BaseProgram
{

   protected IServiceCollection serviceCollection = new ServiceCollection();
   ...

   protected internal void ConfigureServices()
   {
      serviceCollection.Configure<MyConfiguration1>(configuration.GetSection("IndividualConfiguration"));
      serviceCollection.Configure<MyConfiguration2>(configuration.GetSection("IndividualConfiguration"));
      serviceCollection.Configure<MyConfiguration3>(configuration.GetSection("IndividualConfiguration"));
   }

我们想创建一些更通用的东西,像这样:

public T ServiceParameters<T>()
{
    return serviceCollection.Configure<T>(configuration.GetSection("IndividualConfiguration"));
}

通话示例:

var call1 = whatever.ServiceParameters<MyConfiguration1>();
...
var call2 = whatever.ServiceParameters<MyConfiguration2>();

但是,当前的实现TOptions无法实现:

  

注册将与TOptions绑定的配置实例。

     

类型参数:   TOptions:正在配置的选项的类型。

问题:

  

类型“ T”必须是引用类型,才能用作通用类型或方法中的“ TOptions”参数   OptionsConfigurationServiceCollectionExtensions.Configure <TOptions>(IServiceCollection, IConfiguration)

这只有在我们扩展课程的情况下才可能吗?还是我们写错了什么?

1 个答案:

答案 0 :(得分:1)

唯一的约束是TOptions必须是一个类

像这样声明您的方法:

public IServiceCollection ServiceParameters<T>() where T : class

如果不是,则编译器会假定您要传递任何内容作为类型参数(包括结构),而Configure方法无法接受。