【问题标题】:Inheritance works strange with DI [duplicate]DI的继承工作很奇怪[重复]
【发布时间】:2020-08-06 12:09:35
【问题描述】:

我有界面

public interface IActiveDirectoryService
{
   List<ActiveDirectoryUser> GetUsersInGroup(string group);
}

(使用接口)

public class ActiveDirectoryService : IActiveDirectoryService
{
   public List<ActiveDirectoryUser> GetUsersInGroup(string group){...}
}

假类(继承自原类,我只用new关键字重写了一些方法)

public class ActiveDirectoryServiceFake : ActiveDirectoryService
{
   public new List<ActiveDirectoryUser> GetUsersInGroup(string group){...}
}

当我直接调用假服务时,新方法(覆盖/隐藏原始方法)有效。

var service = new ActiveDirectoryServiceFake();
var users = service.GetUsersInGroup(group);

但是当我将这个类设置为 DI 时 Startup.cs

services.AddTransient<IActiveDirectoryService, ActiveDirectoryServiceFake>();

我调用_service.GetUsersInGroup(group),在Visual Studio 中我可以看到,我有ActiveDirectoryServiceFake 的实例,但调用了原来的GetUsersInGroup 方法。

为什么会这样?

【问题讨论】:

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


    【解决方案1】:

    嗯,这很容易。

    您已隐藏该方法而不是覆盖它(the differencenew 关键字不会覆盖成员,override 会。

    在你的情况下,正确的代码应该是这样的:

    public class ActiveDirectoryService : IActiveDirectoryService
    {
       public virtual List<ActiveDirectoryUser> GetUsersInGroup(string group){...}
    }
    
    public class ActiveDirectoryServiceFake : ActiveDirectoryService
    {
       public override List<ActiveDirectoryUser> GetUsersInGroup(string group){...}
    }
    

    【讨论】:

    • 没错。因为它没有覆盖接口方法,所以调用不会重定向到那个类。与那个新方法和接口方法没有任何联系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-04-30
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多