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]>.
> 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]>.
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:[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]>.
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:[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]>.
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:[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]>.
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.