thanks. you have been a great help. hv another question. as I did not
want every member of the class to be intercepted, i created following
hook that inspects the attribute on the members. now issue is
attributes on methods are identified, but not on the property.
public class AutoNotifyPropertyChangedProxyGenerationHook :
IProxyGenerationHook
{
public void MethodsInspected() {}
public void NonProxyableMemberNotification(Type type, MemberInfo
memberInfo) {}
public bool ShouldInterceptMethod(Type type, MethodInfo
methodInfo)
{
return GetAttribute(methodInfo) != null;
}
private static NotifyChangeAttribute GetAttribute(MethodInfo
methodInfo)
{
object[] logAttribute =
methodInfo.GetCustomAttributes(typeof(NotifyChangeAttribute), true);
if (logAttribute.Length == 0)
{
return null;
}
else
{
return (NotifyChangeAttribute)logAttribute[0];
}
}
}
public interface IViewModel
{
[NotifyChange] // this is not identified in the hook.
string Name { get; set; }
[NotifyChange] // this is not identified in the hook.
string Age { get; set; }
[NotifyChange] // this does get indentified
void SomeMethod();
}
Could you please help. thanks
On Aug 11, 9:15 am, Krzysztof Koźmic <[email protected]>
wrote:
> http://stw.castleproject.org/Windsor.Installers.ashx
>
> helper method as in a private method that you'll wrap your repetitive
> code with.
>
> Krzysztof
>
> On 11/08/2010 9:08 AM,PBwrote:
>
>
>
> > could you please provide some reference on writing a helper method in
> > the installer? by installer do you mean application package? thanks
>
> > On Aug 10, 3:15 pm, Krzysztof Koźmic<[email protected]>
> > wrote:
> >> Yes and no.
>
> >> Yes there's no OOTB dedicated hook in the container for this.
> >> No, you don't have to specify that manually for each and every
> >> component. Like I said before you can write a helper method in your
> >> installer that will do it, or build a ComponentModel construction
> >> contributor, although I'd rather suggest going with helper method.
>
> >> Krzysztof
>
> >> On 10/08/2010 3:10 PM,PBwrote:
>
> >>> So you mean if I have 50 classes that I want to provide same logger,
> >>> I’ll have to explicitly register the same interceptor and hook for
> >>> every class
> >>> container.Register(Component.For<LogInterceptor>(),
> >>> Component.For<LoggingProxyGenerationHook>(),
> >>> Component.For<ILogger>().ImplementedBy<Logger>(),
> >>> Component.For<IFoo>().ImplementedBy<Foo>().Interceptors<LogInterceptor>().P¬roxy.Hook(
> >>> h => h.Service<LoggingProxyGenerationHook>()),
> >>> Component.For<IMath>().ImplementedBy<Math>().Interceptors<LogInterceptor>().
> >>> Proxy.Hook(h => h.Service<LoggingProxyGenerationHook>()),
> >>> Component.For<ICar>().ImplementedBy<Car>().Interceptors<LogInterceptor>().
> >>> Proxy.Hook(h => h.Service<LoggingProxyGenerationHook>())
> >>> );
> >>> Can’t we configure the container to use the interceptor for all the
> >>> classes that get resolved by the container? Wouldn’t it be easier and
> >>> cleaner that way, you don’t have to be repetitive.
> >>> I can’t remember exactly, but there was mention of sometime similar by
> >>> creating a facility and registering it, something along those lines?
> >>> Regards
> >>> On Aug 10, 7:50 am, Krzysztof Koźmic<[email protected]>
> >>> wrote:
> >>>> No you cant - adding interceptor is a fine grained task and you
> >>>> seldom
> >>>> want to apply them globally.
> >>>> If you do though - nothis is stopping you from adding a helper method in
> >>>> your installer and registering through it.
> >>>> HTH
> >>>> Krzysztof
> >>>> On 9/08/2010 11:36 PM,PBwrote:
> >>>>> Finally got it working, have couple of questions though.
> >>>>> This is what I did:
> >>>>> public class LoggingProxyGenerationHook : IProxyGenerationHook
> >>>>> {
> >>>>> public bool ShouldInterceptMethod(Type type, MethodInfo
> >>>>> methodInfo)
> >>>>> {
> >>>>> return GetLogAttribute(methodInfo) != null;
> >>>>> }
> >>>>> private static LogAttribute
> >>>>> GetLogAttribute(ICustomAttributeProvider methodInfo)
> >>>>> {
> >>>>> object[] logAttribute = methodInfo.GetCustomAttributes(typeof
> >>>>> (LogAttribute), true);
> >>>>> if (logAttribute.Length == 0)
> >>>>> {
> >>>>> return null;
> >>>>> }
> >>>>> else
> >>>>> {
> >>>>> return (LogAttribute) logAttribute[0];
> >>>>> }
> >>>>> }
> >>>>> }
> >>>>> container.Register(Component.For<LogInterceptor>(),
> >>>>> Component.For<LoggingProxyGenerationHook>(),
> >>>>> Component.For<ILogger>().ImplementedBy<Logger>(),
> >>>>> Component.For<IFoo>().ImplementedBy<Foo>().Interceptors<LogInterceptor>().Proxy.Hook(
> >>>>> h =>
> >>>>> h.Service<LoggingProxyGenerationHook>()));
> >>>>> The above code registers LogInterceptor for implementation of IFoo.
> >>>>> What if I want to use the interceptor with every interface
> >>>>> implementation that is instantiated through the container. Is there a
> >>>>> global level where we can register the interceptor and the proxy hook,
> >>>>> in order to avoid the repetitive task of registeration for each
> >>>>> interface.
> >>>>> Thanks
> >>>>> On Jul 23, 1:25 pm, Krzysztof Koźmic<[email protected]>
> >>>>> wrote:
> >>>>>> Looks like it's missing from v2.1
> >>>>>> You'd have to write custom descriptor and call AddDescriptor(new
> >>>>>> MyDescriptor(new SomeHook()));
> >>>>>> In the descriptor you override the ApplyToModel method like this:
> >>>>>> ProxyUtil.ObtainProxyOptions(model, true).Hook= this.hook;
> >>>>>> or you can upgrade to v2.5 which has that.
> >>>>>> HTH,
> >>>>>> Krzysztof
> >>>>>> On 23/07/2010 1:08 PM,PBwrote:
> >>>>>>> do you know what that way would be?
> >>>>>>> On Jul 20, 12:54 pm, Krzysztof Koźmic<[email protected]>
> >>>>>>> wrote:
> >>>>>>>> Correct, that was added recently. I think there was some way of
> >>>>>>>> specifying hook in v2.1.1 though
> >>>>>>>> On 20/07/2010 12:52 PM,PBwrote:
> >>>>>>>>> Hi
> >>>>>>>>> Thanks for reply. I am using v2.1.1 and there is no implementation
> >>>>>>>>> of
> >>>>>>>>> Hook
> >>>>>>>>> Proxy.Hook(h => h.Service<ProxyNothingHook>()
> >>>>>>>>> Regards
> >>>>>>>>> On Jul 13, 9:58 pm, Krzysztof Koźmic<[email protected]>
> >>>>>>>>> wrote:
> >>>>>>>>>> You don't register PGO, but you can configure all relevant aspects
> >>>>>>>>>> of
> >>>>>>>>>> the proxy mechanism.
> >>>>>>>>>> In trunk version of Windsor you can do:
> >>>>>>>>>> var interceptor = new ResultModifierInterceptor(5);
> >>>>>>>>>> container.Register(Component.For<ResultModifierInterceptor>().Instance(interceptor),
> >>>>>>>>>> Component.For<ProxyNothingHook>(),
> >>>>>>>>>> Component.For<ICalcService>()
> >>>>>>>>>> .ImplementedBy<CalculatorService>()
> >>>>>>>>>>
> >>>>>>>>>> .Interceptors<ResultModifierInterceptor>()
> >>>>>>>>>> .Proxy.Hook(h =>
> >>>>>>>>>> h.Service<ProxyNothingHook>()));
> >>>>>>>>>> var calc = container.Resolve<ICalcService>();
> >>>>>>>>>> Assert.AreEqual(4,calc.Sum(2,2));
> >>>>>>>>>> In version v2.1.1 something similar although you can provide hook
> >>>>>>>>>> only
> >>>>>>>>>> as an instance IIRC.
> >>>>>>>>>> Version 2.5 beta1 does not have it which is my omission. Beta2 and
> >>>>>>>>>> final
> >>>>>>>>>> version will work like the sample above
> >>>>>>>>>> Krzysztof
> >>>>>>>>>> On 13/07/2010 9:53 PM,PBwrote:
> >>>>>>>>>>> I came across this article of your on Selecting which methods to
> >>>>>>>>>>> intercept which shows an implementation of ProxyGenerationOptions
> >>>>>>>>>>> with
> >>>>>>>>>>> ProxyGenerationHook. I am using windsor container and register
> >>>>>>>>>>> types
> >>>>>>>>>>> as follow
> >>>>>>>>>>> IWindsorContainer container = new WindsorContainer();
> >>>>>>>>>>> container.Register(
> >>>>>>>>>>> Component.For<IFoo>().ImplementedBy<Foo>(),
> >>>>>>>>>>>
> >>>>>>>>>>> Component.For<ILogger>().ImplementedBy<Logger>(),
> >>>>>>>>>>>
> >>>>>>>>>>> Component.For<LogInterceptor>().LifeStyle.Transient);
> >>>>>>>>>>> could you please indicate how can i register
> >>>>>>>>>>> ProxyGenerationOptions
> >>>>>>>>>>> using windsor container. Thanks
> >>>>>>>>>>>http://kozmic.pl/archive/2009/01/17/castle-dynamic-proxy-tutorial-par...
> >>>>>>>>>>> On Jul 10, 11:15 pm, Krzysztof Koźmic<[email protected]>
> >>>>>>>>>>> wrote:
> >>>>>>>>>>>> using either IProxyGenerationHook, or IIntreceptorSelector
> >>>>>>>>>>>> Component.For<IFoo>().ImplementedBy<Foo>().Interceptors<SomeInterceptor,
> >>>>>>>>>>>> SomeOtherInterceptor>()
> >>>>>>>>>>>> 2010/7/10PB<[email protected]>:
> >>>>>>>>>>>>> thanks. then how can i prevent a method from being intercepted
> >>>>>>>>>>>>> for
> >>>>>>>>>>>>> interfaces?
> >>>>>>>>>>>>> regards.
> >>>>>>>>>>>>> On Jul 9, 8:05 pm, Krzysztof Koźmic<[email protected]>
> >>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>> You're mixing stuff up here. Attributes and being virtual are
> >>>>>>>>>>>>>> unrelated.
> >>>>>>>>>>>>>> Class components need to have methods virtual to be
> >>>>>>>>>>>>>> interceptable.
> >>>>>>>>>>>>>> Interfaces are virtual by definition.
> >>>>>>>>>>>>>> You don't need attributes at all - just assign interceptor to
> >>>>>>>>>>>>>> the
> >>>>>>>>>>>>>> component when registering it.
> >>>>>>>>>>>>>> Krzysztof
> >>>>>>>>>>>>>> On 9/07/2010 12:30 PM,PBwrote:
> >>>>>>>>>>>>>>> I use Windsor container for DI in my application. I want to
> >>>>>>>>>>>>>>> implement
> >>>>>>>>>>>>>>> interception and confused wether I'll have to change the
> >>>>>>>>>>>>>>> existing
> >>>>>>>>>>>>>>> implementation to use Dynamic Proxy to create objects so that
> >>>>>>>>>>>>>>> they can
> >>>>>>>>>>>>>>> be intercepted or is there a way to integrate with existing
> >>>>>>>>>>>>>>> Windsor
> >>>>>>>>>>>>>>> container.
> >>>>>>>>>>>>>>> Also how can I implement attribute based method interception?
> >>>>>>>>>>>>>>> I don't
> >>>>>>>>>>>>>>> want classes to be attributed with
> >>>>>>>>>>>>>>> [Interceptor(typeof(LogInterceptor))] and then create virtual
> >>>>>>>>>>>>>>> methods.
> >>>>>>>>>>>>>>> Ninject allows you to derive your attribute class from
> >>>>>>>>>>>>>>> InterceptAttribute class and decorate methods for
> >>>>>>>>>>>>>>> interception.
> >>>>>>>>>>>>>>> [AttributeUsage(AttributeTargets.Property|AttributeTargets.Method,
> >>>>>>>>>>>>>>> AllowMultiple = false, Inherited = true)]
> >>>>>>>>>>>>>>> public class LogAttribute : InterceptAttribute
> >>>>>>>>>>>>>>> {
> >>>>>>>>>>>>>>> public override IInterceptor
> >>>>>>>>>>>>>>> CreateInterceptor(IProxyRequest
> >>>>>>>>>>>>>>> request)
> >>>>>>>>>>>>>>> {
> >>>>>>>>>>>>>>> return
> >>>>>>>>>>>>>>> request.Context.Kernel.Get<LogInterceptor>();
> >>>>>>>>>>>>>>> }
> >>>>>>>>>>>>>>> }
> >>>>>>>>>>>>>>> Is it achievable with castle?
> >>>>>>>>>>>>>>> Thanks- Hide quoted text -
> >>>>>>>>>>>>>> - Show quoted text -
> >>>>>>>>>>>>> --
> >>>>>>>>>>>>> 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
> >>>>>>>>>>>>> athttp://groups.google.com/group/castle-project-users?hl=en.-Hidequoted...
> >>>>>>>>>>>> - Show quoted text -- Hide quoted text -
> >>>>>>>>>> - Show quoted text -- Hide quoted text -
>
> ...
>
> read more »- Hide quoted text -
>
> - Show quoted text -
--
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.