我終於使我的腳溼依賴注入(長期過期);我開始玩Unity,並遇到了一個與戰略模式有關的問題。我可以使用容器向我返回基於名稱的策略的特定實現,但我沒有看到的是我如何在上下文中獲得正確的策略。
讓我們舉個簡單的例子來說明:上下文是一輛汽車,它有一個IEngine(策略),有2個實現,FastEngine和SlowEngine。該代碼將沿着這些路線看:使用Unity的策略模式和依賴注入
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關聯,雖然這可能有所幫助。從你所說的話來看,一個容器似乎只有一點幫助。 – Mathias 2009-11-10 20:43:14
我仍然認爲集裝箱是非常有幫助的。在這些情況下,他們只會注入工廠而不是策略,但我想你仍然可以選擇使用容器來實現工廠... – 2009-11-10 21:02:15
哦,我想我明白你的意思了;而不是退回合適的車輛,根據發動機返回正確的工廠。在任何情況下,您的評論re:用於爲抽象提供單個實現的容器都非常有用;它與我看到的以配置爲導向的示例一致。在該框架中,您可以擁有策略模式,但特定的部署只會配置一個實施。 – Mathias 2009-11-11 06:14:11