2015-07-01 2 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>()); 
     }); 
    } 

} 

Конкретный тип IClassC определяется RootType.

Это вывод:

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

Смежные вопросы