Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖链中的Autofac更改实例_C#_Dependency Injection_Autofac - Fatal编程技术网

C# 依赖链中的Autofac更改实例

C# 依赖链中的Autofac更改实例,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我的层次结构看起来像: public类SomeBaseClass{} 公共类Child1:SomeBaseClass{} 公共类Child2:SomeBaseClass{} //对象层次结构 公共A类 { 公共A(B,SomeBaseClass sbc){} } 公共B级 { 公共B(C){} } 公共C类 { 公共B(cc,SomeBaseClass sbc){} } ... 公共X类 { 公共X(SomeBaseClass sbc){} } 班级计划 { 静态void Main() { va

我的层次结构看起来像:

public类SomeBaseClass{}
公共类Child1:SomeBaseClass{}
公共类Child2:SomeBaseClass{}
//对象层次结构
公共A类
{
公共A(B,SomeBaseClass sbc){}
}
公共B级
{
公共B(C){}
}
公共C类
{
公共B(cc,SomeBaseClass sbc){}
}
...
公共X类
{
公共X(SomeBaseClass sbc){}
}
班级计划
{
静态void Main()
{
var builder=new ContainerBuilder();
builder.RegisterInstance(new Child1()).As();
var container=builder.Build();
container.Resolve();
//这里有些工作。
}
}
在某些时候,我希望使用
Child2
而不是
Child1
实例,并在所有层次结构依赖项中使用它。有没有一种方法可以在不构建新容器的情况下做到这一点?最好有这样的东西:

public A ResolveWithBinding(IComponentContext cc,SomeBaseClass sbc)
{
返回cc.Resolve().WithRegistered(sbc);
}
UPD:我找到了一些解决方法:

//注册码
var factory=新的SomeBaseClassAncFactory();
builder.Register(()=>factory.GetCurrentInstance()).As();
//解析代码
公共SomeBaseClass GetCurrentInstance()
{
if(StaticClass.SomeProperty==“A”)
返回新的Clild1();
返回新的Clild2();
}

我担心这不是真正的线程安全方式。而且使用静态属性似乎不是一种“最佳实践”。我希望还有另一个解决方案。

实现一个代理类,允许您在
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();
    }
}

这看起来像个计划。但如何正确设置这些条件呢?所以它可能是线程安全的。@kravasb:这取决于条件是什么。应用程序何时应切换到其他组件?更新了问题,并提供了新的详细信息。我想在运行时切换。@kravasb:更新了我的答案。
//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();
}
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();
    }
}