gpt4 book ai didi

c# - 使用 Unity 的策略模式和依赖注入(inject)

转载 作者:IT王子 更新时间:2023-10-29 04:24:43 26 4
gpt4 key购买 nike

我终于开始涉足依赖注入(inject)(早就应该);我开始玩 Unity 并遇到了策略模式的问题。我可以使用容器返回给我基于名称的策略的具体实现,但我没有看到我应该如何在上下文中获得正确的策略。
让我们用一个简单的例子来说明:上下文是一辆汽车,它有一个 IEngine(策略),有 2 个实现,FastEngine 和 SlowEngine。代码将遵循以下几行:

public interface IEngine
{
double MaxSpeed
{
get;
}
}

internal class FastEngine:IEngine
{
public double MaxSpeed
{
get
{
return 100d;
}
}
}

internal class SlowEngine:IEngine
{
public double MaxSpeed
{
get
{
return 10d;
}
}
}

public class Car
{
private IEngine engine;
public double MaximumSpeed
{
get
{
return this.engine.MaxSpeed;
}
}

public Car(IEngine engine)
{
this.engine = engine;
}
}

我的问题如下:我应该如何实例化一辆快车或慢车?我可以使用容器为我提供每个实现,我可以设置一个“默认”实现来使用:

IUnityContainer container = new UnityContainer();
container.RegisterType<IEngine, FastEngine>();
container.RegisterType<IEngine, FastEngine>("Fast");
container.RegisterType<IEngine, SlowEngine>( "Slow" );
var car = container.Resolve<Car>();
Assert.AreEqual(100, car.MaximumSpeed);

但我想要的是能够请求一辆具有特定策略实现的汽车——比如

var car = container.Resolve<Car>(??? use "Fast" or "Slow ???);

我可以使用容器来做到这一点吗?或者我应该写一个使用容器的工厂吗?任何指导将不胜感激 - 我不确定我对此的想法是否正确!

最佳答案

DI 中的一个常见模式是在运行时只有一个给定抽象的实现。这只会让生活变得更轻松,因为您不需要处理诸如您所描述的歧义。

但是,有时,您需要根据上下文改变实现,例如您提供的示例。许多 DI 容器提供了可以提供限定参数的方法,但这意味着您最终会将代码紧密耦合到特定的 DI 容器。

更好的解决方案是引入 Abstract Factory可以提供你所需要的。有点像

public interface ICarFactory
{
Car Create(IEngine engine);
}

如果您需要注入(inject)更多策略,也许是 Builder设计模式可能更适合。

无论如何,要点是不要在容器中注册很多不同的汽车,而是要注册一个 ICarFactory 实现。

在您的客户端代码中,您将使用注入(inject)的 ICarFactory 创建一个基于特定 IEngine 的 Car 实例。

var car = factory.Create(engine);

关于c# - 使用 Unity 的策略模式和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com