Joni, the scenario in the wiki is just a sample. You *can* extend it to make it work as you want by extending the facility to your needs.
for example call inner of SecurityDecorator securityInner, inner of TransactionDecorator transactionInner etc... than you can pick appropriate handler based on your decorator priority On 9 Mar, 10:50, joniba <[email protected]> wrote: > I would also like to add that the scenario discussed > onhttp://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]. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en.
