2015-12-23 2 views
1

Я имею иерархию, которая выглядит как л:Autofac экземпляра изменений в цепочке зависимостей

public class SomeBaseClass { } 

public class Child1: SomeBaseClass { } 

public class Child2: SomeBaseClass { } 


//Objects hierarchy 

public class A 
{ 
    public A(B b, SomeBaseClass sbc) { } 
} 

public class B 
{ 
    public B(C c) { } 
} 

public class C 
{ 
    public B(C c, SomeBaseClass sbc) { } 
} 

... 

public class X 
{ 
    public X(SomeBaseClass sbc) { } 
} 


class Program 
{ 
    static void Main() 
    { 
    var builder = new ContainerBuilder(); 
    builder.RegisterInstance(new Child1()).As<SomeBaseClass>(); 
    var container = builder.Build(); 

    container.Resolve<A>(); 

    //Some work here. 
    } 
} 

В какой-то момент времени я хотел бы использовать Child2 вместо Child1 инстанции и использовать его во всех иерархических зависимостей. Есть ли способ сделать это без создания нового контейнера? Было бы идеально, чтобы иметь что-то вроде:

public A ResolveWithBinding(IComponentContext cc, SomeBaseClass sbc) 
{ 
    return cc.Resolve<A>().WithRegistered<SomeBaseClass>(sbc); 
} 

UPD: Я нашел какой-то обходной путь:

//Registration code 
var factory = new SomeBaseClassAncFactory(); 
builder.Register(() => factory.GetCurrentInstance()).As<SomeBaseClass>(); 

//Resolve code 
public SomeBaseClass GetCurrentInstance() 
{ 
    if(StaticClass.SomeProperty=="A") 
    return new Clild1(); 
    return new Clild2(); 
} 

И я боюсь, что это на самом деле не резьбовых безопасный способ. И похоже, что использование статических свойств не является «лучшей практикой». Надеюсь, есть еще одно решение.

ответ

1

Внедрение прокси-класса, который позволяет динамически переключаться между Client1 и Client2. Например:

public class SomeBaseClassProxy : SomeBaseClass 
{ 
    private Client1 c1; 
    private Client2 c2; 

    public SomeBaseClassProxy(Client1 c1, Client2 c2) { 
     this.c1 = c1; 
     this.c2 = c2; 
    } 

    private GetClient() { 
     return StaticClass.SomeProperty == "A" ? c1 : c2; 
    } 

    // SomeBaseClass methods 
    public override void SomeMethod() { 
     GetClient().SomeMethod(); 
    } 
} 
+0

Это выглядит как план. Но как правильно установить эти условия? Таким образом, он может быть потокобезопасным. – kravasb

+0

@kravasb: Это зависит от того, что это за условие. Когда приложение должно переключиться на другой компонент? – Steven

+0

обновленный вопрос с новыми деталями. Я бы хотел переключиться во время выполнения. – kravasb

Смежные вопросы