我已經做了相當多的搜索和搜索,所以找不到類似的問題或答案。如何使用StructureMap配置文件設置命名實例?
在典型的SM配置,你可以爲一個PluginType添加多個命名實例:
ForRequestedType<IFoo>()
.AddInstances(x => {
x.OfConcreteType<FooA>().WithName("FooA");
x.OfConcreteType<FooB>().WithName("FooB");
});
沒問題的。問題是我創建配置文件時無法做到這一點。解釋如何使用配置文件中的大多數示例使用通過ProfileExpression
的For<>()
方法:
CreateProfile("Default", p => {
p.For<IFoo>().UseConcreteType<FooC>();
});
我似乎無法找到一個方法來添加多個命名實例爲同一PluginType,你可以用正則配置上面做的。通過ProfileExpression
唯一可用的其他方法是Type<>()
,但我不確定它是否可用於此目的。
編輯:我試圖用Type<>()
而不是For<>()
,它似乎把我在正確的方向,但我碰到了另一個問題。爲了更好地解釋在這裏是什麼,我試圖做一個更好的例子(這是我發佈到structuremap用戶羣,沒有答案了):
ObjectFactory.Initialize(x => {
x.CreateProfile("Nissan", p =>
{
p.Type<ICar>().Is.OfConcreteType<NewNissanCar>().WithName("New");
p.Type<ICar>().Is.OfConcreteType<OldNissanCar>().WithName("Old");
});
x.CreateProfile("Honda", p =>
{
p.Type<ICar>().Is.OfConcreteType<NewHondaCar>().WithName("New");
p.Type<ICar>().Is.OfConcreteType<OldHondaCar>().WithName("Old");
});
});
ObjectFactory.Profile = "Nissan";
ICar newCar = ObjectFactory.GetNamedInstance<ICar>("New"); // -> returns NewHondaCar
ICar car = ObjectFactory.GetInstance<ICar>(); // -> returns OldNissanCar
所以,即使我的配置文件設置爲「日產「,GetNamedInstance<>("New")
從錯誤的配置文件返回了一個實例 - 它應該返回NewNissanCar
而不是NewHondaCar
。
有趣的是,GetInstance<>()
使用正確的配置文件,但因爲我不能傳遞一個實例名,從該配置文件實現ICar
(我猜它只是返回添加了對接口的最後一個具體類型)返回一個任意的具體類型。
這將工作,如果我想重用一個現有的命名實例。不幸的是,我想註冊一個新的具體類型並給它一個名字。看過我在問題中給出的例子後,我認爲我應該不會再在配置文件中使用FooA。我會盡力解決它,以澄清我的意圖。 – khaledh 2009-08-18 13:41:49