具有多个实现的一个接口的多个生命周期

时间:2012-05-15 13:04:17

标签: c# dependency-injection castle-windsor lifecycle

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

IFoo

FooA : IFoo 生命周期:单身人士

FooB : IFoo 生命周期:瞬态

1 个答案:

答案 0 :(得分: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);