Exactly. so the ConventionBased (and [Service] based) thing should fit into
there.


btw, [Service] is wrong imo, since when we say "Service" in the context of
the container, we usually refer to the interface, not the implementation,
however the attribute does go on the implementation
[Component] make more sense.






On Thu, Jan 21, 2010 at 6:08 PM, Craig Neuwirt <[email protected]> wrote:

> That's how it works already
>
> kernel.Register(AllTypes.FromAssembly(asm)
>    .BasedOn<IController>(...)
>    .BasedOn<IIFilter>(...)
>
> all in 1 iteration of assembly
>
> On Thu, Jan 21, 2010 at 10:05 AM, Ken Egozi <[email protected]> wrote:
>
>> The convention based registration works great for us, and it is of great
>> value I believe.
>>
>> However I do get a slow startup time, because of repeatedly iterating over
>> the assemblies' GetExportedTypes collections, once for MR components, once
>> for the convention configurations, and more.
>> what could be great is some kind of a way to hook into a single iteration
>> over an assembly types collection, and supplying an action for every one (if
>> it's a MR controller/filer/etc, if it's a Service that implements IService,
>> etc.)
>>
>>
>>
>> 2010/1/21 Krzysztof Koźmic (2) <[email protected]>
>>
>>> Alvin,
>>>
>>>
>>> Problem is this approach won't work when matching constructor
>>> parameters, and it changes semantics of the dependencies.
>>>
>>> when you specify just a name with string, you're being implicit about
>>> what kind of dependency it is (property or method argument) and let
>>> Windsor figure it out.
>>> Indeed depending on which constructors Windsor can satisfy, the same
>>> call can lead to having the dependency injected as ctor arg, and other
>>> time as property.
>>>
>>> I think it's a great strength of Windsor, and I much dislike being
>>> explicit about it when dealing with some other containers. You could
>>> provide certain strongly typed helpers via extension methods but I'd
>>> vote for not including that in the core API.
>>>
>>> Krzysztof
>>>
>>> PS,
>>> thanks for improving the docs!
>>>
>>> On 21 Sty, 16:40, alwin <[email protected]> wrote:
>>> > I would really like to configurate components more strongly typed than
>>> > using strings for parameters and service overrides.
>>> >
>>> > I've made stuff in the past but it's more bolted on top of MK than
>>> > nicely integrated into it:
>>> http://using.castleproject.org/display/IoC/Strongly+Typed+property+wi...http://groups.google.com/group/castle-project-users/browse_thread/thr.
>>> ..
>>> >
>>> > Something like this would be great:
>>> >
>>> > // Use registration model as value for service override
>>> > var dependency = container.Register
>>> > (component.For<IDependency>..config...)
>>> > container.Register(
>>> >         Component.For<IConsumer>().ImplementedBy<TheConsumer>()
>>> >                 .ServiceOverrides(ServiceOverride.For<IDependency>().Eq
>>> > (dependency))
>>> >         );
>>> >
>>> > or even:
>>> > // Easier discoverability when using intellisense?
>>> > container.Register(register =>
>>> >         register.ComponentFor<IConsumer>().ImplementedBy<TheConsumer>
>>> > ()
>>> >                 .ServiceOverrides(s => s.For<IDependency>().Eq
>>> > (dependency))
>>> >         );
>>> >
>>> > If you guys are into this I can try to provide some patches (no
>>> > promises...).
>>> >
>>> > On 21 jan, 15:32, Richard Fleming <[email protected]> wrote:
>>> >
>>> > > That was why in this case I would suggest creating a method to allow
>>> the
>>> > > user to register interface types which they would like to be their
>>> > > registerable interfaces, I wouldn't want to force that on users
>>> either, just
>>> > > in my case wasn't necessary since my interface exists in the same
>>> project as
>>> > > the functionality :) .
>>> >
>>> > > On Thu, Jan 21, 2010 at 8:29 AM, Ayende Rahien <[email protected]>
>>> wrote:
>>> > > > 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]>
>>> <castle-project-devel%[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]<castle-project-devel%[email protected]>
>>> <castle-project-devel%[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]<castle-project-devel%[email protected]>
>>> .
>>>
>>> For more options, visit this group at
>>> http://groups.google.com/group/castle-project-devel?hl=en.
>>>
>>>
>>>
>>>
>>
>>
>> --
>> Ken Egozi.
>> http://www.kenegozi.com/blog
>> http://www.delver.com
>> http://www.musicglue.com
>> http://www.castleproject.org
>> http://www.idcc.co.il - הכנס הקהילתי הראשון למפתחי דוטנט - בואו בהמוניכם
>>
>> --
>> 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]<castle-project-devel%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/castle-project-devel?hl=en.
>
>


-- 
Ken Egozi.
http://www.kenegozi.com/blog
http://www.delver.com
http://www.musicglue.com
http://www.castleproject.org
http://www.idcc.co.il - הכנס הקהילתי הראשון למפתחי דוטנט - בואו בהמוניכם
--
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