【问题标题】:Resolve dependency Injection for abstract class in .Net core 2.0解决 .Net core 2.0 中抽象类的依赖注入
【发布时间】:2019-12-03 13:31:50
【问题描述】:

我正在使用 .net Core 2.0。

我有一个 MemberInfo 类,它将继承 Member Abstract 类。需要解决 StartUp.cs 文件中的依赖关系。

public class MemberInfo : Member
{
    public MemberInfo()
    {

    }
}
public abstract class Member: IMemberDetails
{
    public DateTime currentDate = DateTime.Now;;
} 

在startup.cs文件中

public void ConfigureServices(IServiceCollection services)
  {   
 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddScoped<IMemberDetails, Member>();
services.AddScoped<Member, MemberInfo >();
}

我收到异常消息

InvalidOperationException: Unable to resolve service for type 'MemberIfo' while attempting to activate 'ProcessData'.

【问题讨论】:

  • 显示ProcessData 类(包括构造函数及其参数)

标签: c# asp.net-mvc .net-core asp.net-core-2.0


【解决方案1】:

您的 ProcessData-Class 找不到 MemberInfo,因为您添加了 MemberInfo 作为 Member-class 的表示。如果您想直接访问 MemberInfo 类型,您需要使用 services.AddScoped&lt;MemberInfo, MemberInfo &gt;(); 或更短的 services.AddScoped&lt;MemberInfo&gt;();

如果您只需要抽象定义,您应该请求抽象类 Member,而不是 ProcessData 类中的具体实现 MemberInfo。为了更清楚地区分定义和实现,您可能需要添加一个接口,正如this answer 中指出的那样。

如果你想让两种类型都指向同一个实现,但又不想在同一个范围内有多个实例,你可以这样做:

services.AddScoped<MemberInfo>();
services.AddScoped<Member>((serviceProvider) => serviceProvider.GetRequiredService<MemberInfo>());

【讨论】:

    【解决方案2】:

    第一个你在注入 MemberInfo 时遇到语法错误,但显示 MemberIfo 的日志可能是问题所在,最好使用 Interface 进行注入,也许你的 Member 类在 services.AddScoped&lt;Member, MemberInfo &gt;(); 中接口从这里很难分辨。

    另外DependencyInjections 仅在Controller 类中工作。您的类不继承自 Controller 类,也不使用关键字“Controller”。 你的代码:

    public class MemberInfo : Member
    {
        public MemberInfo()
        {
    
        }
    }
    public abstract class Member: IMemberDetails
    {
        public DateTime currentDate = DateTime.Now;;
    }
    

    依赖注入实际上应该是什么样子:

    public class MemberInfoController : Controller
    {
          IMemberDetails details;
          public MemberInfo(IMemberDetails det)
          {
              details = det;
          }
    }
    
    // further code
    

    还有一些注意事项

    如果你不想在控制器之外使用注入依赖,你可以通过一个函数来传递它。

    这样

    // Here was DependencyInjection
    
    public IActionResult res()
    {
       MyClass class = new MyClass();
       class.SomeFunc(details);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2023-03-06
      相关资源
      最近更新 更多