【问题标题】:Autofac change instance in dependency chain依赖链中的 Autofac 更改实例
【发布时间】:2016-03-29 19:15:50
【问题描述】:

我的层次结构看起来像:

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();
}

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

【问题讨论】:

    标签: c# dependency-injection autofac


    【解决方案1】:

    实现一个代理类,允许您在Client1Client2 之间动态切换。例如:

    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:更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多