2010-05-05 5 views
0

У меня есть интерфейс IModule и несколько классов, которые его реализуют. В тесте мне нужно создать экземпляр каждого типа (класса), реализующего этот интерфейс. Возможно ли (с StructureMap)?.NET - создать экземпляр каждого типа, который реализует конкретный интерфейс

ответ

3

Я не знаком с StructureMap. В любом случае вам нужно иметь список типов, реализующих IModule, тогда вы создаете объект каждого типа в списке.

Чтобы получить список типов динамически, это может быть:

var types = 
    from asm in AppDomain.CurrentDomain.GetAssemblies() 
    from type in asm.GetType() 
    where !type.IsAbstract 
    where typeof(IModule).IsAssignableFrom(type) 
    select type; 

для конкретизации типов:

IModule[] instances = (
    from type in types 
    select (IModule)Activator.CreateInstance(type)) 
    .ToArray(); 
+0

работает отлично, но asm.GetTypes() следует отфильтровать, чтобы не возвращать интерфейсы, так как он также возвращает IModule. ... GetTypes(). Где (t =>! T.IsInterface) ... – Feryt

+0

@Feryt: Я добавил 'where! Type.IsAbstract' ответ (после включения ответа в LINQ). Это решает даже больше, чем только '! T.IsInterface'. Обратите внимание, что это не решит все проблемы, потому что некоторым типам может не хватать открытый конструктор по умолчанию или это определение общего типа. – Steven

3

Чтобы сделать это с помощью StructureMap:

var container = new Container(x => x.Scan(scan => 
{ 
    scan.TheCallingAssembly(); // there are options to scan other assemblies 
    scan.AddAllTypesOf<IModule>(); 
})); 

var allInstances = container.GetAllInstances<IModule>(); 
+0

Работает идеально. Спасибо. – Feryt

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