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, PB wrote:
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 -
- Show quoted text -- Hide quoted text -
- Show quoted text -- Hide quoted text -
- Show quoted text -- 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.