0

I have interface IModule and several classes that implements it. In test i need to create instance of each type(class) implementing that interface. Is is possible(with StructureMap)?

Feryt
  • 2,262
  • 2
  • 22
  • 32

2 Answers2

3

I'm not familiar with StructureMap. Anyway you need to have the list of types implementing IModule, then you create an object of each type in the list.

To get the list of types dynamically, it can be:

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

To instantiate the types:

IModule[] instances = (
    from type in types
    select (IModule)Activator.CreateInstance(type))
    .ToArray();
Steven
  • 166,672
  • 24
  • 332
  • 435
742
  • 3,009
  • 3
  • 23
  • 18
  • Works fine, but asm.GetTypes() should be filtered to not returns interfaces, as it returns IModule too. ...GetTypes().Where(t => !t.IsInterface)... – Feryt May 05 '10 at 10:01
  • @Feryt: I added `where !type.IsAbstract` to the answer (after turning the answer into LINQ). This solves even more than only `!t.IsInterface`. Note that this will not solve all problems, because some types could lack a public default constructor or are a generic type definition. – Steven May 05 '10 at 10:52
3

To do it using 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>();
Joshua Flanagan
  • 8,527
  • 2
  • 31
  • 40