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.


Reply via email to