依赖注入有两个相同依赖的实例
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>();
我一直在努力解决一个小的 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>();