2015-07-01 27 views
1

假設下面的類結構:定製解決嵌套的相關

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

假設我想用ClassC1每當它是用來解決具體IClassA,即container.GetInstance<IClassA>()將返回

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

我能做些什麼像這樣在StructureMap中? (理想情況下,像For<ClassA>().Nest(x => x.For<IClassC>().Use<ClassC1>()),但任何事情會怎麼做。)

+0

這與http://stackoverflow.com/q/6575883/1180926類似,但是這要求能夠「跳過:鏈中的步驟,因此允許單個聲明'IClassC'。 – Arithmomaniac

回答

1

這是我得到:

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

} 

具體類型IClassCRootType確定。

這是輸出:

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

它表明ClassC1用於構建ClassA及其依賴性,但用於構建單獨IClassB使用ClassC2

+0

什麼是'UseIfNone'做的三元不能做? – Arithmomaniac

+0

@Arithmomaniac好注意!它什麼也沒做,我忘了在試驗後刪除這條線,我更新了答案並刪除了這一行。 – Kirill