我已经做了相当多的谷歌搜索和搜索SO这里,也没有找到类似的问题或答案。
在典型的SM配置,你可以添加多个命名实例单个PluginType:
ForRequestedType<IFoo>()
.AddInstances( x => {
x.OfConcreteType<FooA>().WithName( "FooA" );
x.OfConcreteType<FooB>().WithName( "FooB" );
} );
这里没有问题。 问题是,创建一个配置文件时,我不能这样做。 解释如何使用简档最示例使用For<>()
所传递的方法ProfileExpression
:
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
(我猜它只是返回添加了对接口的最后一个具体类型) 。