Я имею иерархию, которая выглядит как л: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();
}
И я боюсь, что это на самом деле не резьбовых безопасный способ. И похоже, что использование статических свойств не является «лучшей практикой». Надеюсь, есть еще одно решение.
Это выглядит как план. Но как правильно установить эти условия? Таким образом, он может быть потокобезопасным. – kravasb
@kravasb: Это зависит от того, что это за условие. Когда приложение должно переключиться на другой компонент? – Steven
обновленный вопрос с новыми деталями. Я бы хотел переключиться во время выполнения. – kravasb