2

I've used Castle Windsor quite a bit. It has a really handy facility for registering types via reflection. So for example, I would do things like this at application startup:

container.Register(Classes.FromThisAssembly().BasedOn<IMyInterface>().LifestyleTransient());

So, say I had a bunch of providers for data formatting - I could register them all (via interface) with that one line. Even better, when I created new ones (assuming they were in that same assembly, and same interface) they would then get registered as well; I wouldn't have to remember to do this when coding them.

Is there an equivalent in ServiceStack's implementation of the Funq container? I've looked around, and don't seem to see one.

StratMN
  • 161
  • 8

1 Answers1

1

An interface can only have a single implementation, but if you wanted to register all concrete types implementing an interface by scanning to find all types and pre-registering them with:

var fooTypes = assembly.GetTypes().Where(x => x.HasInterface(typeof(IFoo)));
container.RegisterAutoWiredTypes(fooTypes);

Which if needed can all be retrieved with:

 var fooInstances = fooTypes.Select(c.Resolve).Cast<IFoo>();

Which can also be registered as a dependency itself:

container.Register(c => fooTypes.Select(c.Resolve).Cast<IFoo>()); 

That your classes can access using property injection:

public IEnumerable<IFoo> FooInstances { get; set; }
mythz
  • 141,670
  • 29
  • 246
  • 390