Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将服务注入子类中可用的抽象类的变通方法-asp.net core_C#_Asp.net Core - Fatal编程技术网

C# 将服务注入子类中可用的抽象类的变通方法-asp.net core

C# 将服务注入子类中可用的抽象类的变通方法-asp.net core,c#,asp.net-core,C#,Asp.net Core,更新 嗯,我不确定我在问什么,所以有点XY问题/讨论 现在的主要问题是,我有一个抽象基类,可以看作是一个服务,以及从it属性/抽象方法派生的子服务 我尝试过使用界面的变通方法,但没有成功。我不需要控制器中的IOtherService,所以我不想将其注入控制器中 启动: services.AddTransient<IMyBaseService, MyBaseService>(); 派生服务 public class DerivedService : MyBaseService {

更新 嗯,我不确定我在问什么,所以有点XY问题/讨论

现在的主要问题是,我有一个抽象基类,可以看作是一个服务,以及从it属性/抽象方法派生的子服务

我尝试过使用界面的变通方法,但没有成功。我不需要控制器中的IOtherService,所以我不想将其注入控制器中

启动:

services.AddTransient<IMyBaseService, MyBaseService>();
派生服务

public class DerivedService : MyBaseService
{
    public DerivedService(string x)
    {
    }

    public DoStuff()
    {
        OtherService.RunSomething(); 
    }
}
我只需要在我的基础服务中注入IOtherService,这样我的子服务就可以从继承的属性中使用它

或者这是一个财产注入的例子

基类:

派生类:


这样,就有一个构造函数定义派生类所需的依赖项。然后,派生类将调用基类的构造函数。

如果在不提供代码的情况下将接口添加到Vehicle,则所有继承者要么必须为其提供代码,要么自己就是一个抽象类。对于继承,接口的工作方式非常类似于抽象函数。要么你把它们编码出来,要么你必须保持抽象。@Christopher是的,我在想,我觉得有点糟糕。我会很好地更新问题。是否要将依赖项直接注入实体模型?这是一个巨大的反模式。我认为你做错了什么。如果汽车是一个模型,它不应该有任何功能。如果它有一个功能,所以它是一种服务,那么应该将它添加到ServiceCollection中,这样VehicleCleaner就可以直接注入其中@BakedInhalf您可以通过引入VehicleBaseParams类来减少麻烦,该类将在DI中注册,并具有所有必需的基本DEP。你仍然需要像我之前写的那样,通过整个层次结构传递它。但是,然后我需要将ICleanVehicle注入控制器,然后作为“Car”的参数。我希望避免这种情况。我只是想让它出现,没有别的办法。构造函数用于实例化类。如果您调用两个构造函数,您将得到两个实例。@BakedInhalf您可以在DI中注册Car,这样所有依赖项都将得到解决。和/或使用一些反射魔法引入@BakedInhalf,您可以减少手动工作。您缺少派生构造函数调用
public class DerivedService : MyBaseService
{
    public DerivedService(string x)
    {
    }

    public DoStuff()
    {
        OtherService.RunSomething(); 
    }
}
public abstract class Vehicle : ICleanVehicle
{
   private readonly ICleanVehicle _cleanVehicle;

   public Vehicle(ICleanVehicle cleanVehicle)
   {
      if (cleanVehicle == null) throw new ArgumentNullException("cleanVehicle");
      _cleanVehicle = cleanVehicle;
   }
}
public class Car : Vehicle
{
    private readonly ICleanVehicle _cleanVehicle;

    public Car(ICleanVehicle cleanVehicle) : base(cleanVehicle)
    {
        _cleanVehicle = cleanVehicle;
    }
}