自定义解析嵌套依赖

Custom resolve nested dependencies

假设以下 class 结构:

ClassA (IClassB classb, IClassC classc) : IClassA
ClassB (IClassC classc) : IClassB
ClassC1 () : IClassC
ClassC2 () : IClassC

假设我想在 ClassC1 用于具体解析 IClassA 时使用它,即 container.GetInstance<IClassA>() 会 return

new ClassA(
 new ClassB (new ClassC1()),
 new ClassC1()
)

我可以在 StructureMap 中做这样的事情吗? (理想情况下,类似于 For<ClassA>().Nest(x => x.For<IClassC>().Use<ClassC1>()),但任何东西都可以。)

这是我得到的:

public interface IClassA
{
}

public interface IClassB
{
}

public interface IClassC
{
}

public class ClassA: IClassA
{
    public ClassA(IClassB classb, IClassC classc)
    {
        Console.WriteLine("ClassA");
        Console.WriteLine("  ClassB: {0}", classb.GetType());
        Console.WriteLine("  ClassC: {0}", classc.GetType());
    }
}

public class ClassB : IClassB
{
    public ClassB(IClassC classc)
    {
        Console.WriteLine("ClassB");
        Console.WriteLine("  ClassC: {0}", classc.GetType());
    }
}

public class ClassC1 : IClassC
{
    public ClassC1()
    {
        Console.WriteLine("ClassC1");
    }
}

public class ClassC2 : IClassC
{
    public ClassC2()
    {
        Console.WriteLine("ClassC2");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IContainer container = ConfigureDependencies();

        container.GetInstance<IClassA>();
        container.GetInstance<IClassB>();
    }

    private static IContainer ConfigureDependencies()
    {
        return new Container(x =>
        {
            x.For<IClassA>().Use<ClassA>();
            x.For<IClassB>().Use<ClassB>();
            x.For<IClassC>().Use(z => z.RootType == typeof(ClassA) ? (IClassC) z.GetInstance<ClassC1>() : z.GetInstance<ClassC2>());
        });
    }

}

IClassC 的具体类型由 RootType 决定。

这是输出:

ClassC1
ClassB
  ClassC: MongodbEnumerable.ClassC1
ClassA
  ClassB: MongodbEnumerable.ClassB
  ClassC: MongodbEnumerable.ClassC1
ClassC2
ClassB
  ClassC: MongodbEnumerable.ClassC2

表明 ClassC1 用于构造 ClassA 及其依赖项,但用于构造单独的 IClassB 时使用了 ClassC2