2012-05-15 54 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);