Belvasis, I see what you're saying. It looks like that could work. The
downside of this technique, though, is that I have to duplicate these
two registrations for every single repository (there are over 30 right
now). Now think if I had a 3-decorator chain (that's the plan): I
would have to write 4 entries for each repository. E.g.,
1. Register validation decorator for Document-type with inner to
security decorator
2. Register security decorator for Document-type with inner to
transaction decorator
3. Register transaction decorator for Document-type with inner to
Document repository
4. Register Document repository

For 30 repositories, that's 120 entries. That's why I wanted to do it
generically using AllTypes.


Joni


On Mar 9, 12:07 pm, Belvasis <[email protected]> wrote:
> But if you implement every repository based on the concrete type it becomes
> much easier:
>
>    <component
>         id="doc.repository"
>        service="Definition.IWriteRepository`1[[Domain.Document,Domain]],
> Definition"
>
> type="DecoratorImpl.SecurityRepositoryDecorator`1[[Domain.Document,Domain]],
> DecoratorImpl"
>         lifestyle="transient">
>         <parameters>
>             <Inner>${doc.repository_impl}</Inner>
>         </parameters>
>     </component>
>     <component
>         id="doc.repository_Impl"
>       service="Definition.IWriteRepository`1[[Domain.Document,Domain]],
> Definition"
>         type="RepositoryImpl.DocumentRepository, RepositoryImpl"
>         lifestyle="transient">
>     </component>
>
> So you can easily write containter.Resolve<IWriteRepository<Document>>()
> without needing a key. But maybe i miss something
> from your requirements.
>
> 2010/3/9 Roelof Blom <[email protected]>
>
> > How would you ever guarantee the ordering of the decorators?
>
> > On Tue, Mar 9, 2010 at 10:50 AM, joniba <[email protected]> wrote:
>
> >> I would also like to add that the scenario discussed on
> >>http://stw.castleproject.org/Windsor.Decorators.ashx, as far as I can
> >> tell, does not support decorator chains, but only a single decorator.
> >> Because I could have a security-decorator that expects as its inner a
> >> transaction-decorator, whose inner would be the actual implementation.
> >> In which case the SelectHandler code, assuming the "inner" key could
> >> be passed to it, would still not be able to provide the desired
> >> functionality.
>
> >> Joni
>
> >> On Mar 9, 11:32 am, joniba <[email protected]> wrote:
> >> > Hi Krzysztof,
> >> > Thanks for the links. Perhaps you can help me understand something
> >> > from the first one. Please bear with me as I am just getting started
> >> > with Castle.
>
> >> > My question is about this method:
>
> >> > public IHandler SelectHandler(string key, Type service, IHandler[]
> >> > handlers)
> >> >         {
> >> >                 if (!"inner".Equals(key,
> >> StringComparison.OrdinalIgnoreCase))
> >> >                 {
> >> >                         return
> >> handlers.Where(IsDecorator).FirstOrDefault();
> >> >                 }
>
> >> >                 return handlers.Where(h => IsDecorator(h) ==
> >> > false).FirstOrDefault();
> >> >         }
>
> >> > First, in order for a key to be passed to the SelectHandler method, I
> >> > would need to ask the container to resolve by key which, if I
> >> > understand correctly, it won't "just do" because my (in the example)
> >> > CustomerRepositoryDecorator has a parameter named "inner" that needs
> >> > to be resolved.
> >> > Hence, my conclusion is that registering the decorator would look
> >> > something like this:
>
> >> > container.Register
> >> >             (
> >> >                 Component.For(typeof(IRepository<Customer>))
> >> >                 .ImplementedBy(typeof(CustomerRepositoryDecorator))
> >> >                 .DynamicParameters
> >> >                 ((kernel, dict) =>
> >> >                     dict["inner"] =
> >> > kernel.Resolve<IRepository<Customer>>("inner")
> >> >                 )
> >> >             );
>
> >> > But of course that can't work because I have not registered any
> >> > component with key "inner". And I couldn't register the
> >> > CustomerRepository with key "inner" because there could be many
> >> > decorators or many repositories and the key must be unique.
>
> >> > Could you tell me what I'm missing?
>
> >> > Thanks
> >> > Joni
>
> >> > On Mar 8, 8:04 pm, Krzysztof Koźmic <[email protected]>
> >> > wrote:
>
> >> > >http://stw.castleproject.org/Windsor.Decorators.ashxhttp://ayende.com.
> >> ..
>
> >> > > On 3/8/2010 6:47 PM, joniba wrote:
>
> >> > > > Hi Krzysztof, how would implementing the IHandlerSelector help me?
> >> How
> >> > > > will I differentiate between the initial call to (continuing the
> >> > > > example)
>
> >> > > > container.Resolve<IWriteRepository<Document>>()
>
> >> > > > With castle windsor's internal attempt to resolve the
> >> > > > SecurityRepositoryDecorator's "inner" parameter?
>
> >> > > > Thanks
> >> > > > Joni
>
> >> > > > On Mar 8, 7:17 pm, Krzysztof Koźmic<[email protected]>
> >> > > > wrote:
>
> >> > > >> use IHandlerSelector
>
> >> > > >> On 3/8/2010 5:59 PM, joniba wrote:
>
> >> > > >>> Hi all, I'm trying to use Castle Windsor to implement decorator
> >> > > >>> chains, as per Ayende's msdn post. However, I'm using the fluent
> >> API,
> >> > > >>> and I want to know if it can be done en masse.
>
> >> > > >>> Without the decorators I have:
>
> >> > > >>> container.Register
> >> > > >>>                   (
> >> > > >>>                       AllTypes.FromAssembly(assembly)
> >> > > >>>                       .IncludeNonPublicTypes()
>
> >> .BasedOn(typeof(IWriteRepository<>)).WithService.Base()
> >> > > >>>                       .Configure(component =>
> >> > > >>> component.LifeStyle.Transient)
> >> > > >>>                   );
>
> >> > > >>> (Which works fine.)
> >> > > >>> My decorators also implement IWriteRepository<T>, and take as the
> >> > > >>> inner, an IWriteRepository<T>. For example:
>
> >> > > >>> public class SecurityRepositoryDecorator<TEntity>    :
> >> > > >>> IWriteRepository<TEntity>
> >> > > >>>       {
> >> > > >>>           private IWriteRepository<TEntity>    inner;
>
> >> > > >>>           public
> >> SecurityRepositoryDecorator(IWriteRepository<TEntity>
> >> > > >>> inner)
> >> > > >>>           {
> >> > > >>>               this.inner = inner;
> >> > > >>>           }
> >> > > >>>       }
>
> >> > > >>> Is this impossible because of a circular reference to
> >> > > >>> IWriteRepository<>?
> >> > > >>> I would like to get to:
>
> >> > > >>> var repository = container.Resolve<IWriteRepository<Document>>();
>
> >> > > >>> And have this return a SecurityRepositoryDecorator wrapping a
> >> > > >>> DocumentRepository.
> >> > > >>> Any ideas are appreciated.
>
> >> > > >>> Joni
>
> >> --
> >> You received this message because you are subscribed to the Google Groups
> >> "Castle Project Users" group.
> >> To post to this group, send email to
> >> [email protected].
> >> To unsubscribe from this group, send email to
> >> [email protected]<castle-project-users%[email protected]>
> >> .
> >> For more options, visit this group at
> >>http://groups.google.com/group/castle-project-users?hl=en.
>
> >  --
> > You received this message because you are subscribed to the Google Groups
> > "Castle Project Users" group.
> > To post to this group, send email to [email protected]
> > .
> > To unsubscribe from this group, send email to
> > [email protected]<castle-project-users%[email protected]>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/castle-project-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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-users?hl=en.

Reply via email to