【问题标题】:Dependency injection with abstract class in .NET Core.NET Core 中抽象类的依赖注入
【发布时间】:2021-05-06 09:05:22
【问题描述】:

我不知道如何在抽象类中使用依赖注入。让我用一个简单的例子告诉你我的问题:

public abstract class Animal {

    public abstract void Move();

    public void Sleep() 
    {
        restService.StartSleeping(1000);    //how to get this service here?
    }
}

public class Cat : Animal
{
    public readonly IMotionService _motionService;    

    public Cat(IMotionService motionService)
    {
       _motionService = motionService;
    }

    public override void Move()
    {
        _motionService.Run();
    }
}

public class Bird : Animal
{
    public readonly IMotionService _motionService;    

    public Bird(IMotionService motionService)
    {
       _motionService = motionService;
    }

    public override void Move()
    {
        _motionService.Fly();
    }
}

每只动物都以不同的方式移动,因此Move() 函数在每个派生类中单独实现。正如您可能注意到的,整个实现来自motionService。 另一方面,所有动物都以相同的方式睡觉,所以我想将Sleep() 实现放在一个基本抽象类中以避免重复代码,但我不能将我的restServiceSleep 实现一起使用,因为我没有'不知道如何将服务类注入抽象类。

我想过IServiceProvider,但它也应该注入。

【问题讨论】:

  • 您将restService 注入CatBird ctors,并将其传递给Animal ctors

标签: c# .net-core dependency-injection abstract-class


【解决方案1】:

你这样传下去:

public abstract class Animal 
{
    private readonly IRestService restService;

    public Animal( IRestService restService )
    {
        this.restService = restService;
    }

    public abstract void Move();

    public void Sleep() 
    {
        restService.StartSleeping(1000);
    }
}

public class Cat : Animal
{
    // vv Should be private!
    public readonly IMotionService _motionService;    

    public Cat(IMotionService motionService, 
               IRestService restService)
            : base(restService) // pass on to base class ctor
    {
       _motionService = motionService;
    }

    public override void Move()
    {
        _motionService.Run();
    }
}

// Same in `Bird` class

供参考:Using Constructors (C# Programming Guide)

【讨论】:

  • 这是 gd,但我认为您还应该包括如何为 DI 注册它
  • @Seabizkit 如果 OP 成功注册并注入IMotionService,他应该能够相应地注册并注入IRestService,你不觉得吗?
  • @Seabizkit 不,不会。这是同一个服务,只是Bird和Cat使用了不同的方法。查看问题代码示例。如果它们不同的实现,那么这将是一个完全不同的问题。这是关于如何将 restService 注入基类。
  • @Seabizkit 只是 Cats Run() 和 Birds Fly() 提供相同的服务:D
  • 非常感谢您的帮助。像魅力一样工作:)
猜你喜欢
  • 1970-01-01
  • 2019-12-03
  • 2018-09-13
  • 2021-09-01
  • 2023-03-06
  • 2016-05-22
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多