c# - .NET Core 中抽象类的依赖注入(inject)

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

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

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 ,所以我想把 Sleep()在基本抽象类中实现以避免重复代码,但我不能使用我的 restServiceSleep实现,因为我不知道如何将服务类注入(inject)抽象类。
我想过IServiceProvider但它也应该注入(inject)。

最佳答案

你像这样传递它:

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)

关于c# - .NET Core 中抽象类的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67415026/

相关文章:

c# - 将 SQL 数据读取器数据加载到 DataTable 时遇到问题

c# - .NET Core 基于角色的身份 Cookie 动态过期

.net-core - 有关 .NET Core 中 .NET Reflection 支持的查询

c# - EntityFrameworkCore.PostgreSQL 转换点

dependency-injection - 函数依赖注入(inject)

c# - DevExpress:XtraGridView 自定义列绑定(bind)

c# - 具有静态成员的枚举与常量/类?

c# - 映射到字典

c# - 如何在主容器中注册类型,但在子容器中解析?

java - Guice 注入(inject)器使用的最佳实践