2012-05-15 25 views
0

CastleWindsor是否可以使用多个实现为一个接口配置多个生命周期?具有多个实现的多个生命周期一个接口

IFoo 

FooA : IFoo生命周期:辛格尔顿

FooB : IFoo生命周期:瞬态

+0

你能更具体?目前你试图达到的目标有点模糊。 – Steven

+2

这样比较好,但还不够。你想如何解决/注入他们?你想给他们注入一个“IFoo”吗?如果是这样,什么时候应该使用'FooA',何时使用'FooB'? – Steven

+0

那么底层的问题是什么?你为什么问这个? – kko

回答

0

没有更多的情况下,我最好的答案是:使用代理:

public class FooProxy : IFoo 
{ 
    private readonly FooA a; 
    private readonly FooB b; 

    public FooProxy(FooA a, FooB b) 
    { 
     this.a = a; 
     this.b = b; 
    } 

    void IFoo.SomeFooMethod() 
    { 
     this.GetFooBasedOnSomeCondition().SomeFooMethod(); 
    } 

    private IFoo GetFooBasedOnSomeCondition() 
    { 
     return condition ? this.a : this.b; 
    } 
} 

这个代理类取决于FooAFooB,您可以将其注册为瞬态,以解析为IFoo

另一个选项是注册一个委托工厂,返回正确实施:

container.AddFacility<FactorySupportFacility>(); 

container.Register(Component.For<IFoo>() 
    .UsingFactoryMethod(() => 
    { 
     return condition 
      ? container.Resolve<FooA>() 
      : container.Resolve<FooB>(); 
    }) 
    .LifeStyle.Transient);