2016-02-16 5 views
0

Если я установил свои зависимости с помощью AutoFac в следующем коде, как я могу убедиться, что objects.ToList() возвращает список с X количеством элементов?получить X экземпляров типа Y в конструкторе

public interface IClassA { ... } 
public class ClassA : IClassA { ... } 

public interface IClassB { ... } 
public class ClassB : IClassB 
{ 
    public ClassB(IEnumerable<IClassA> objects) 
    { 
    } 
} 

Текущий код контейнера здания (обратите внимание, что это используется в сочетании с Topshelf):

public static class DependencyContainer 
{ 
    public static IContainer BuildContainer() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<ClassA>().As<IClassA>(); 
     builder.RegisterType<ClassB>().As<IClassB>().SingleInstance(); 

     return builder.Build(); 
    } 
} 
+1

Что не работает? С этой регистрацией вы должны получить массив IClassA с одним элементом в своем конструкторе ClassB ... – nemesv

+0

@nemesv да, но я хочу массив с 4 элементами. или 10. или X. Мне нужно иметь возможность настроить сколько. и, конечно, это должны быть разные экземпляры. – user1151923

ответ

2

Если добавить следующие строки в ваш DependencyContainer класса, то вы можете указать, какие случаи должны быть введены в ClassB конструктор:

builder.Register(c => 
       return new [] { c.Resolve<IClassA>(), c.Resolve<IClassA>() }) 
      .As<IEnumerable<IClassA>>(); 

Итак:

public static class DependencyContainer 
{ 
    public static IContainer BuildContainer() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<ClassA>().As<IClassA>(); 
     builder.RegisterType<ClassB>().As<IClassB>().SingleInstance(); 

     builder.Register(c => 
      return new [] { c.Resolve<IClassA>(), c.Resolve<IClassA>() }) 
       .As<IEnumerable<IClassA>>(); 

     return builder.Build(); 
    } 
} 

Если вы хотите, чтобы динамически создать ряд во время выполнения можно добавить следующее в DependencyContainer класс:

public static IEnumerable<IClassA> CreateInstances(IComponentContext component) 
{ 
    const int number = 3; // <-- YOU COULD READ THIS FROM A CONFIG FILE 
    List<IClassA> instances = new List<IClassA>(); 

    for(int i = 0; i < number; i++) 
    { 
     instances.Add(component.Resolve<IClassA>()); 
    } 

    return instances; 
} 

А потом заменить Register(c => return new [] { ... }) с:

builder.Register(c => CreateInstances(c)).As<IEnumerable<IClassA>>(); 
Смежные вопросы