Castle Windsor 3 – Classes and Types
In my previous post on strongly typed sessions in ASP.NET, I had to manually look through the current assembly and retrieve all interfaces that end in “Session”. To register these interfaces with my container, I had to loop through each type found and register them one-by-one:
IEnumerable<Type> sessions = Assembly .GetExecutingAssembly() .GetTypes() .Where(x => x.IsInterface && x.Name.EndsWith("Session")); foreach (Type session in sessions) { Type sessionTemp = session; container.Register ( Component .For(session) .UsingFactoryMethod(x => { var factory = x.Resolve<DictionaryAdapterFactory>(); return factory.GetAdapter<object>(sessionTemp, new SessionDictionary(HttpContext.Current.Session)); }) .LifeStyle.PerWebRequest );
Unfortunately, Castle Windsor 2.x did not have support for finding and registering interfaces with no implementions for use with a factory method or typed factories. I also couldn’t take advantage of the rich registration API of the AllTypes
class since AllTypes
only returned concrete classes.
Enter Castle Windsor 3. In version 3, Castle Windsor introduced two new registration classes, Classes
and Types
. The Classes
class is identical to AllTypes
. The new Types
class returns all types, including interfaces, abstract classes, and concrete classes.
We can now update the registration code above to take advance of the new Types
class:
container.Register ( Types .FromThisAssembly() .Where(t => t.IsInterface && t.Name.EndsWith("Session")) .Configure(c => c.UsingFactoryMethod(f => { var factory = f.Resolve<DictionaryAdapterFactory>(); return factory.GetAdapter<object>(c.Implementation, new SessionDictionary(HttpContext.Current.Session)); })) .LifestylePerWebRequest() );