如何使用StructureMap配置文件设置命名实例?(How to setup named ins

2019-09-24 02:31发布

我已经做了相当多的谷歌搜索和搜索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,你可以用正则配置上面做的。 可通过唯一的其他方法ProfileExpressionType<>()但我不知道这是否可以被用于此目的。

编辑:我试图用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 (我猜它只是返回添加了对接口的最后一个具体类型) 。

Answer 1:

我不是语法100%肯定,但我相信这是正确的:

container = new Container(x => {

    x.ForRequestedType<IFoo>()
        .AddInstances(y =>
        {
            y.OfConcreteType<FooA>().WithName("FooA");
            y.OfConcreteType<FooB>().WithName("FooB");
        });

    x.CreateProfile("Default")
        .For<IFoo>().UseNamedInstance("FooA");

});


Answer 2:

它看起来并不像在配置文件级别命名实例StructureMap方面。 我只是想车子例如与SM 2.6.3,并得到了相同的结果。 你也可以看到它的输出ObjectFactory.WhatDoIHave()

ICar (ConsoleApplication1.ICar)                       
Scoped as:  Transient
      "New" Configured Instance of ConsoleApplication1.NewHondaCar, ConsoleApplication1
      "Old" Configured Instance of ConsoleApplication1.OldHondaCar, ConsoleApplication1

它看起来像配置文件可能被使用的名称为好,这可以解释为什么它不支持内部实现。 当我注册的非命名实例的每个配置文件,我看到这个输出:

ICar (ConsoleApplication1.ICar)                       
Scoped as:  Transient
      "Default Instance for Profile Nissan" Configured Instance of ConsoleApplication1.NewNissanCar, ConsoleApplication1
      "Default Instance for Profile Honda" Configured Instance of ConsoleApplication1.NewHondaCar, ConsoleApplication1

注意配置文件的名称是如何实际上是实例密钥的名称的一部分。 我没有通过代码走,但这是什么似乎发生。



文章来源: How to setup named instances using StructureMap profiles?