【问题标题】:.NET 5 vNext Resolving dependencies with parameters.NET 5 vNext 使用参数解决依赖关系
【发布时间】:2015-10-06 01:25:46
【问题描述】:

我已经能够使用 vNext DI 使用无参数构造函数解决依赖关系。

但是当我试图为我的依赖项之一指定一个参数时,它给出了运行时错误:

System.InvalidOperationException 无法解析服务类型 尝试激活“Namespace.MyService”时的“System.String”

构造函数:

public MyService(string name)
{
    // initialize
}

用法:

private readonly IMyService _myService;
public Consumer(IMyService myService)
{
        // initialize
        _myService = myService;
}

我通过添加以下内容更新了此依赖项注册:

services.AddInstance(new MyService("Hello"));

仅当我将 Consumer 类构造函数参数更新为使用类型 MyService

时才有效

我最初的注册是:

services.AddTransient<IMyService, MyService>(); // Todo: configure constructor injection

我真的想在这个过程中使用接口而不是具体的类。我怎样才能让它工作?

【问题讨论】:

    标签: c# asp.net dependency-injection visual-studio-2015 asp.net-core


    【解决方案1】:

    就像明确指定服务的类型一样简单:

    services.AddInstance<IMyService>(new MyService("Hello"));
    

    编译器通常会推断泛型参数类型,但您始终可以显式指定泛型类型参数。

    【讨论】:

      【解决方案2】:

      另一件需要考虑的事情,虽然目前还没有太多的文档,但不要在构造函数中使用字符串,而是使用 IOptions 类并将字符串作为选项的属性

      http://shazwazza.com/post/using-aspnet5-optionsmodel/

      然后如果需要,您可以在不更改构造函数的情况下添加要传入的属性

      【讨论】:

      • 我去看看。谢谢!
      【解决方案3】:

      还有一种方法,你可以添加配置类:

      public class MyServiceConfig
      {
          public MyServiceConfig(string name)
          {
              // initialize
          }
      }
      
      public class MyService
      {
          public MyService(MyServiceConfig myServiceConfig)
          {
              // initialize
          }
      }
      
      services.AddInstance(new MyServiceConfig("Hello"));
      services.AddTransient<IMyService, MyService>();
      

      【讨论】:

      • 这个答案指出了我的代码有什么问题。我的类构造函数有“字符串名称”参数,DI 尝试注入字符串!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多