StructureMap - > EnrichWith过多(其他实例)

hdz*_*hdz 5 .net c# structuremap inversion-of-control

// Enrich with is enriching more than i want

public intefrace ICommand {
   void Execute();
}

// classes

public class A : ICommand {}
public class B : ICommand {}
public class MultiCommand : ICommand {
  public MultiCommand(ICommand[] commands) {}
}

// -- decorators
public DecoratorOne : ICommand {
  public DecoratorOne(Icommand toDecorate) {}
}

public DecoratorTwo : ICommand {
  public DecoratorOne(Icommand toDecorate) {}
}



// what i tried

 ForREquesedType<ICommand>()
    .TheDefaultIsConcreteType<A>
    .EnrichWith(x => new DecoratorOne(x)
    .EnrichWith(y => new DecoratorTwo(y)
    .CacheBy(InstanceScope.Singleton);

 InstanceOf<ICommand>()
    .TheDefault.Is.OfConcreteType<B>
    .EnrichWith(x => new DecoratorOne(x)
    .WithName("secondCommand")

            ForRequestedType<MultiCommand>()
                .TheDefault.Is.OfConcreteType<MultiCommand>()
                .TheArrayOf<ICommand>()
                .Contains(y =>
                              {
                                  y.TheDefault();
                                  y.TheInstanceNamed("secondCommand")
                              })
                .WithName("multi");
Run Code Online (Sandbox Code Playgroud)

**

/// 我想做的事

**

我想要的是A是默认值.所以任何需要ICommand实例的地方都会得到A. MultiCommand将同时拥有A和B并将在循环中执行它们.

**

//我遇到的问题

**

B似乎装饰了几次.当我打电话给ObjectFactory.GetNamedInsance<ICommand>("secondCommand")我的时候我会得到一些新的**new DecoratorOne(new DecorateOne(B)).**我假设它正在装饰,因为我有默认的定义,A.我怎么能避免这个?

将数组注入多命令的正确方法是什么?

再次感谢,我是结构地图的新手,所以任何帮助将不胜感激.

UPDATE

我最终做的是创建一个TypeInterceptor的子类,它适当地修饰类型.这对我来说不合适,但它比在我的代码中使用'new'更好.所以代码变成了

        RegisterInterceptor(new CommandDecoratorInterceptor());

        // this is the default that everyone hooks into
        ForRequestedType<ICOmmand>()
            .TheDefaultIsConcreteType<A>()
            .CacheBy(StructureMap.Attributes.InstanceScope.Singleton);

        InstanceOf<ICommand>()
            .Is.OfConcreteType<B>()
            .WithName("secondCommand");


        ForRequestedType<MultiCommand>()
            .TheDefault.Is.OfConcreteType<MultiCommand>()
            .TheArrayOf<ICommand>()
            .Contains(y =>
                          {
                              y.TheDefault();
                              y.TheInstanceNamed("secondCommand");
                          });
Run Code Online (Sandbox Code Playgroud)

然后新的Type拦截器像以前一样装饰类.这允许MultiMonitor避免被解压缩(丰富).

任何有关改善这一点的建议将不胜感激;)

egl*_*ius 4

在丰富之前不要使用 TheDefaultIsConcreteType。这就像在 ForRequestedType() 之后立即执行此操作一样,这表示您想要丰富所有 ICommand。请改用 TheDefault.Is.OfConcreteType。

也不要加倍丰富,它在替换实例时不能很好地链接。以下内容应该适用于您的场景:

    ForRequestedType<ICommand>()
        .CacheBy(StructureMap.Attributes.InstanceScope.Singleton)
        .TheDefault.Is.OfConcreteType<A>()
        .EnrichWith(x => new DecoratorTwo(new DecoratorOne(x)));
    InstanceOf<ICommand>().Is
        .OfConcreteType<B>()
        .EnrichWith(x => new DecoratorOne(x))
        .WithName("second");
    InstanceOf<ICommand>().Is
        .OfConcreteType<MultiCommand>()
        .TheArrayOf<ICommand>().Contains(y =>
        {
            y.TheDefault();
            y.TheInstanceNamed("second");
        })
        .WithName("multi");
Run Code Online (Sandbox Code Playgroud)