Just as an alternative method to a [Service] attribute I do something along
the following in most of my projects now:
public interface IRegisterable { }
public interface IRegisterableWithFactory : IRegisterable { }
public static class WindsorExtensions
{
public static BasedOnDescriptor FirstInterfaceOnType(this
ServiceDescriptor serviceDescriptor)
{
return serviceDescriptor.Select((type, baseType) =>
GetInterfacesOnType(type));
}
private static IEnumerable<Type> GetInterfacesOnType(Type type)
{
var interfaces =
type.GetInterfaces().Except(type.BaseType.GetInterfaces());
return interfaces.Count() == 0
? (typeof(object).Equals(type.BaseType) ? null :
GetInterfacesOnType(type.BaseType))
: new[] { interfaces.First() };
}
}
public DefaultContainer AddRegisterableComponentsFrom(Assembly
assembly)
{
return
AddRegisterableComponentsFrom(assembly.GetTypes().ToList());
}
public DefaultContainer
AddRegisterableComponentsFrom(IEnumerable<Type> types)
{
Register(
AllTypes.Pick().From(from t in types
where !t.IsClass && typeof
(IRegisterableWithFactory).IsAssignableFrom(t)
select
t).WithService.FirstInterfaceOnType().Configure(
c => c.Attribute("instance-accessor").Eq("Instance")));
Register(
AllTypes.Pick().From(from t in types
where t.IsClass && !t.IsAbstract &&
typeof(IRegisterable).IsAssignableFrom(t) &&
!typeof(IRegisterableWithFactory).IsAssignableFrom(t)
select
t).WithService.FirstInterfaceOnType());
return this;
}
(DefaultContainer is my class inheriting from WindsorContainer where I
configure facilities outside of configuration)
What I liked about this method was it allowed me to control
auto-registration by having a custom interface defined (and typically
creating an AbstractComponent or something of that sort which implements
IRegisterable).
Just thought I would throw this out there as another alternative, I was
thinking along the lines of possible if there was a way to register a
interface type(s) as the "auto-registering" (IRegisterable in this case)
within the container to make the functionality more general across multiple
projects.
Thanks,
Rick Fleming
> > - Consider adding attributes like [Service] - to make auto
>> registration
>> > easier.
>>
>> +1
>>
>> > - Convention based registration for fluent stuff
>> > - IFoo -> Foo
>> > - IFoo -> FooImpl
>> > - IFoo -> FooService
>>
>> - I'm not sure what you mean by that...
>>
>>
> contianer.AddAssembly("foo");
>
> - scan for all interfaces
> - for each interface, look for a matching type based on the following
> naming conventions, if exists, register it.
> - same for types marked as [Service] that implement only one interface
> - if there is more than one interface implemented, require a interface
> parameter on the attribute.
>
--
You received this message because you are subscribed to the Google Groups
"Castle Project Development List" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/castle-project-devel?hl=en.