Wouldn't it make it identical to the 1st example?
That's what it is doing.

On 3/12/2010 11:23 PM, Simone Busoli wrote:
I like the second one. Any need to pass a second parameter when you actually pass the component model and this it's writable collection of interceptors? I would pass only the model and document explicitly not to modify its collection but instead return the merged collection back.

2010/3/12 Krzysztof Koźmic (2) <[email protected] <mailto:[email protected]>>

    Order of insertion most likely

    On 12 Mar, 09:40, Ayende Rahien <[email protected]
    <mailto:[email protected]>> wrote:
    > Yes
    > Although I am not sure what you would be sorting on
    >
    > 2010/3/12 Krzysztof Koźmic (2) <[email protected]
    <mailto:[email protected]>>
    >
    > > so we basically have now the following two suggestions (in
    > > pseudocode):
    > >http://gist.github.com/330162
    >
    > > correct?
    >
    > > On 12 Mar, 09:06, Ayende Rahien <[email protected]
    <mailto:[email protected]>> wrote:
    > > > Note; answering the entire thread.
    >
    > > > The original reason behind IModelInterceptorsSelector was
    that we needed
    > > to
    > > > make dynamic decisions about some piecesof code. In
    particular, whatever
    > > > transactions were active or not.
    > > > The design at the time called to allow the
    IModelInterceptorsSelector to
    > > > totally replace the default interceptors, and I would like
    to keep that
    > > as
    > > > an option.
    > > > Regarding the operation mode, I agree that using the return
    value is
    > > clearer
    > > > than a method that is expected to modify its arguments. I
    would actually
    > > go
    > > > further than that and say that we need to pass a readonly
    collection to
    > > that
    > > > method. Not a modifable one.
    > > > When the docs say that you merge the model.Interceptors with
    what the
    > > > selector returns, it means that you merge them and _return
    the merged
    > > > value_.
    >
    > > > 2010/3/11 Simone Busoli <[email protected]
    <mailto:[email protected]>>
    >
    > > > > sure, I will prepare one for a real case I'm on now.
    >
    > > > > 2010/3/11 Krzysztof Koźmic <[email protected]
    <mailto:[email protected]>>
    >
    > > > >>  the way I understand it you want to create a single
    empty collection
    > > of
    > > > >> interceptors, and pass it to each selector in turn.
    > > > >> This means that subsequent selectors can see, and
    override choice made
    > > by
    > > > >> previous one, which breaks independence of selectors.
    >
    > > > >> I really feel we should discuss a real example at this point.
    >
    > > > >> Krzysztof
    >
    > > > >> On 3/11/2010 8:16 AM, Simone Busoli wrote:
    >
    > > > >> I think all your considerations are well satisfied by a
    void return
    > > method
    > > > >> which modifies the existing collection in any way it wants.
    > > > >> If you don't like modifying method arguments then we
    could pass in a
    > > > >> delegate.
    >
    > > > >> 2010/3/11 Krzysztof Koźmic <[email protected]
    <mailto:[email protected]>>
    >
    > > > >>> we've been relying on order to do decorators, with quite
    good
    > > results.
    > > > >>> We're cutting edge here, we give people scissors.
    >
    > > > >>> Current design keeps selectors independent, which I
    consider to be a
    > > good
    > > > >>> thing.
    > > > >>> You don't have to have just one selector if you need so.
    I expressed
    > > my
    > > > >>> personal preference, nothing more. I would use more than
    a single
    > > selector
    > > > >>> if I felt a need with no hesitation.
    > > > >>> Also current design does not put any requirements at you WRT
    > > > >>> model.Interceptors.
    >
    > > > >>> Perhaps it would be more beneficial if we moved from
    abstract concept
    > > to
    > > > >>> some actual example where you feel having that
    capability (single jar
    > > of
    > > > >>> interceptors passed between all selectors) would be
    required.
    >
    > > > >>> cheers,
    > > > >>> Krzysztof
    >
    > > > >>> On 3/10/2010 10:53 PM, Simone Busoli wrote:
    >
    > > > >>>  I see selectors as a step in the pipeline where you can
    apply
    > > > >>> additional concerns, you don't care about what's already
    there, you
    > > just add
    > > > >>> behavior if necessary.
    > > > >>> That's why I don't think there should be only 1 selector
    and why a
    > > > >>> selector shouldn't care about the stuff that's already in
    > > > >>> model.Interceptors. That's why I'm saying we're probably
    looking at
    > > things
    > > > >>> under a different perspective.
    >
    > > > >>>  About order of registration for selectors, I think it's
    a very bad
    > > way
    > > > >>> of doing things. To me the order of two calls to
    container.Register
    > > (or most
    > > > >>> of what else you could put into the container: facilities,
    > > interceptors,...)
    > > > >>> should mean as much as the order of two fields in a class.
    > > > >>> If you're relying on that you're looking for troubles.
    >
    > > > >>> 2010/3/10 Krzysztof Koźmic <[email protected]
    <mailto:[email protected]>>
    >
    > > > >>>>  On 3/10/2010 10:37 PM, Simone Busoli wrote:
    >
    > > > >>>> inline
    >
    > > > >>>> 2010/3/10 Krzysztof Koźmic <[email protected]
    <mailto:[email protected]>>
    >
    > > > >>>>>  On 3/10/2010 10:15 PM, Simone Busoli wrote:
    >
    > > > >>>>> 2010/3/10 Krzysztof Koźmic <[email protected]
    <mailto:[email protected]>>
    >
    > > > >>>>>>  On 3/10/2010 9:59 PM, Simone Busoli wrote:
    >
    > > > >>>>>> inline
    >
    > > > >>>>>> 2010/3/10 Krzysztof Koźmic
    <[email protected] <mailto:[email protected]>>
    >
    > > > >>>>>>> you put interceptors in whatever order you please.
    >
    > > > >>>>>>  how?
    >
    > > > >>>>>>  You create the array yourself in the selector. You
    choose what to
    > > put
    > > > >>>>>> there, and in what order. it doesn't even have to
    have anything in
    > > common
    > > > >>>>>> with componentModel.Interceptors collection
    >
    > > > >>>>>  Can you see that all interceptors in
    model.Interceptors are
    > > appended
    > > > >>>>> after those selected by all selectors?
    >
    > > > >>>>>  Yes, I can see that. I would execute that code only
    when no
    > > selector
    > > > >>>>> has opinion about component model in question.
    >
    > > > >>>>  I'm not sure that would be a good choice, but we
    definitely need to
    > > > >>>> define what selectors are for. In my opinion they
    should have a
    > > chance to
    > > > >>>> modify the existing collection of interceptors. If they
    don't care
    > > about the
    > > > >>>> order then they will eventually append their stuff
    otherwise they
    > > will do
    > > > >>>> nothing. With the current code we're really looking for
    bugs with
    > > duplicate
    > > > >>>> interceptors appended at the end.
    >
    > > > >>>>  Why wouldn't this be a good choice?
    >
    > > > >>>> Either selectors want to override the choice, or we go
    with default.
    > > > >>>> Should work IMO.
    >
    > > > >>>>>>> between selectors order of selectors transfers to
    order of
    > > > >>>>>>> interceptors. Plus I think you should not have
    multiple selectors
    > > for
    > > > >>>>>>> one model so it's a non-issue anyway.
    >
    > > > >>>>>>  why? I'm using multiple selectors to apply different and
    > > unrelated
    > > > >>>>>> concerns to models. Do you think I should centralize
    a bunch of
    > > unrelated
    > > > >>>>>> stuff into the same class?
    >
    > > > >>>>>>  Give me a scenario. But despite of it, doesn't order
    of selectors
    > > > >>>>>> give you enough control?
    >
    > > > >>>>>  A selector handling whether we need to add
    transaction interceptor
    > > > >>>>> and another handling exception-related stuff.
    > > > >>>>> Ideally I wouldn't like to depend on the order of
    selectors and put
    > > > >>>>> that logic in the selectors themselves, for instance,
    transaction
    > > > >>>>> interceptor should be last. (in this I would like to
    extend
    > > > >>>>> InterceptorReferenceCollection to support keeping an
    interceptor in
    > > a
    > > > >>>>> certain position even if other interceptors are added
    later)
    >
    > > > >>>>>  now we're talking :)
    > > > >>>>> I still think that you can achieve this with ordering
    of selectors
    > > > >>>>> without changing the interface. Plus you always can use
    > > IInterceptorSelector
    > > > >>>>> to select/order interceptors at a method level.
    >
    > > > >>>>  Would you be confident in relying on the order in
    which you
    > > register
    > > > >>>> your selectors? I'd prefer to let the selector itself
    decide where
    > > to put
    > > > >>>> its interceptor/s.
    >
    > > > >>>>  I think I would 99% of the time. And for the remaining
    1% I'd use
    > > > >>>> IInterceptorSelector.
    >
    > > > >>>>>>> in addition I'm against passing interceptors
    selected by one
    > > > >>>>>>> selector,
    > > > >>>>>>> to subsequent selectors.
    >
    > > > >>>>>>  this is the current code. how do you apply order?
    how do you
    > > remove
    > > > >>>>>> interceptors?
    >
    > > > >>>>>>     foreach(IModelInterceptorsSelector selector in
    selectors)//
    > > > >>>>>> selectors are asked in order you register them in
    > > > >>>>>>    {
    > > > >>>>>>   InterceptorReference[] interceptors =
    > > > >>>>>> selector.SelectInterceptors(model);
    >
    > > > >>>>>>  + if (interceptors == null)
    > > > >>>>>> + {
    > > > >>>>>> + continue;
    > > > >>>>>> + }
    > > > >>>>>> +
    > > > >>>>>> + foreach (InterceptorReference interceptor in
    interceptors)
    > > > >>>>>>  + yield return interceptor; // interceptors are
    returned in order
    > > > >>>>>> selector put them in the array
    > > > >>>>>>    }
    > > > >>>>>> +
    > > > >>>>>> + foreach (InterceptorReference interceptor in
    model.Interceptors)
    > > > >>>>>> + yield return interceptor;
    > > > >>>>>>   }
    >
    > > > >>>>>>  Note that model.Interceptors are concatenated to
    anything
    > > returned
    > > > >>>>> by selectors, so you don't have control unless you
    modify the
    > > collection
    > > > >>>>> directly.
    >
    > > > >>>>>>> 2010/3/10 Simone Busoli <[email protected]
    <mailto:[email protected]>>:
    > > > >>>>>>> > Except that I don't agree with this principle, the
    return
    > > value
    > > > >>>>>>> doesn't let
    > > > >>>>>>> > you specify where exactly to put the interceptor.
    So the return
    > > > >>>>>>> value
    > > > >>>>>>> > provides a subset of the functionality provided by
    the input
    > > > >>>>>>> collection.
    >
    > > > >>>>>>> > 2010/3/10 Krzysztof Koźmic
    <[email protected] <mailto:[email protected]>>
    >
    > > > >>>>>>> >> void methods should not modify their arguments
    >
    > > > >>>>>>> > --
    > > > >>>>>>> > 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]
    <mailto:[email protected]>.
    > > > >>>>>>> > To unsubscribe from this group, send email to
    > > > >>>>>>> > [email protected]
    
<mailto:castle-project-users%[email protected]><castle-project-users%[email protected]
    <mailto:castle-project-users%[email protected]>>
    > > <castle-project-users%[email protected]
    
<mailto:castle-project-users%[email protected]><castle-project-users%[email protected]
    <mailto: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]
    <mailto:[email protected]>.
    > > > >>>>>>> To unsubscribe from this group, send email to
    > > > >>>>>>> [email protected]
    
<mailto:castle-project-users%[email protected]><castle-project-users%[email protected]
    <mailto:castle-project-users%[email protected]>>
    >
    > ...
    >
    > więcej >>

    --
    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]
    <mailto:[email protected]>.
    To unsubscribe from this group, send email to
    [email protected]
    <mailto: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.

--
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