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.我怎么能避免这个?
将数组注入多命令的正确方法是什么?
再次感谢,我是结构地图的新手,所以任何帮助将不胜感激.
我最终做的是创建一个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避免被解压缩(丰富).
任何有关改善这一点的建议将不胜感激;)
在丰富之前不要使用 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)
| 归档时间: |
|
| 查看次数: |
2392 次 |
| 最近记录: |