我不知道如何在抽象类中使用依赖注入(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()
在基本抽象类中实现以避免重复代码,但我不能使用我的 restService
与 Sleep
实现,因为我不知道如何将服务类注入(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/