I wouldn't like to have something like this for the simple reason that I want to avoid forcing people to implement my interface.
On Thu, Jan 21, 2010 at 4:21 PM, Richard Fleming <[email protected]>wrote: > 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]<castle-project-devel%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/castle-project-devel?hl=en. >--
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.
