我已经做了相当多的搜索和搜索,所以找不到类似的问题或答案。如何使用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