依赖注入有两个相同依赖的实例

Dependency injection have two instances of same dependency

我一直在努力解决一个小的 DI 问题,我认为应该很容易解决,但由于某种原因我找不到解决方案。

我有一项服务应该以相同的方式将一个 DI 对象用于两个不同的事物。

public class EquationManager : IEquationManager
{
       private readonly IEquationEvaluator _equationEvaluator;
       private readonly IEquationEvaluator _inversEquationEvaluator;
    
       public EquationManager(IEquationEvaluator equationEvaluator)
       {
           _equationEvaluator = equationEvaluator;
           _inversEquationEvaluator = equationEvaluator;
       }
}

所以我需要的是同一个 DI 的 2 个实例。就这样。如果我按原样编写代码,它们是浅拷贝,我为 _inversEquationEvaluator 设置的内容也会在 _equationEvaluator 中更新(这是正常的)。

我如何拥有同一个 DI 的 2 个独立实例?这可能以简单的方式实现吗?我想避免在容器中以两种不同的方式注册 IEquationEvaluator

我的第二个问题:我的架构有问题吗?我想要在这里实现的是有一个数学方程式,它接受一个输入参数 (int) 并输出一个双精度值。我现在需要一种方法来使用其他方程式来恢复此过程。所以我输入了一个 double 值,理论上我应该获得一个 int 值。 IEquationEvaluator 是处理数学运算的 class。

您可以使用这种模式:

 public enum EquationEvaluatorType
    {
        EquationEvaluator,
        InversEquationEvaluator
    }


    public interface IEquationEvaluator
    {
        public EquationEvaluatorType Type { get; }

        //your methods and properties
    }

    public class EquationEvaluator : IEquationEvaluator
    {
        public EquationEvaluatorType Type => EquationEvaluatorType.EquationEvaluator;
    }

    public class InversEquationEvaluator : IEquationEvaluator
    {
        public EquationEvaluatorType Type => EquationEvaluatorType.InversEquationEvaluator;
    }

    public class EquationManager : IEquationManager
    {
        private readonly IEquationEvaluator _equationEvaluator;
        private readonly IEquationEvaluator _inversEquationEvaluator;

        public EquationManager(IEnumerable<IEquationEvaluator> items)
        {
            _equationEvaluator = items.First(x=>x.Type==EquationEvaluatorType.EquationEvaluator);
            _inversEquationEvaluator = items.First(x => x.Type == EquationEvaluatorType.InversEquationEvaluator);
        }
    }

并且在您的启动中:

  services.AddScoped<IEquationEvaluator, EquationEvaluator>();
  services.AddScoped<IEquationEvaluator, InversEquationEvaluator>();