diff --git a/src/Spring/Spring.Web/Web/Support/ControlInterceptor.cs b/src/Spring/Spring.Web/Web/Support/ControlInterceptor.cs
index 9b08f9de..80c85534 100644
--- a/src/Spring/Spring.Web/Web/Support/ControlInterceptor.cs
+++ b/src/Spring/Spring.Web/Web/Support/ControlInterceptor.cs
@@ -34,13 +34,13 @@ namespace Spring.Web.Support
///
/// Erich Eichinger
internal sealed class ControlInterceptor
- {
+ {
private class NoOpInterceptionStrategy : IInterceptionStrategy
{
- private ILog Log = LogManager.GetLogger(typeof(NoOpInterceptionStrategy));
+ private ILog Log = LogManager.GetLogger( typeof( NoOpInterceptionStrategy ) );
- public bool Intercept(IApplicationContext defaultApplicationContext, ControlAccessor ctlAccessor,
- ControlCollectionAccessor ctlColAccessor)
+ public bool Intercept( IApplicationContext defaultApplicationContext, ControlAccessor ctlAccessor,
+ ControlCollectionAccessor ctlColAccessor )
{
return true;
}
@@ -55,16 +55,16 @@ namespace Spring.Web.Support
, new InterceptControlCollectionOwnerStrategy()
};
- ///
- /// The last resort interception strategy...
- ///
+ ///
+ /// The last resort interception strategy...
+ ///
private static readonly IInterceptionStrategy s_noopInterceptionStrategy = new NoOpInterceptionStrategy();
///
/// Holds a control.GetType()->IInterceptionStrategy table.
///
private static readonly Hashtable s_cachedInterceptionStrategies = new Hashtable();
-
+
///
/// Holds well-known Type/Strategy mappings.
///
@@ -72,7 +72,7 @@ namespace Spring.Web.Support
static ControlInterceptor()
{
- s_knownInterceptionStrategies[typeof(ControlCollection)] = s_availableInterceptionStrategies[1];
+ s_knownInterceptionStrategies[typeof( ControlCollection )] = s_availableInterceptionStrategies[1];
}
private ControlInterceptor()
@@ -82,7 +82,7 @@ namespace Spring.Web.Support
///
/// Ensures, a control has been intercepted to support Web-DI. If not, the control will be intercepted.
///
- public static void EnsureControlIntercepted(IApplicationContext defaultApplicationContext, Control control)
+ public static void EnsureControlIntercepted( IApplicationContext defaultApplicationContext, Control control )
{
if (control is LiteralControl)
{
@@ -90,47 +90,63 @@ namespace Spring.Web.Support
}
// check control itself
- if (IsDependencyInjectionAware(defaultApplicationContext, control))
+ if (IsDependencyInjectionAware( defaultApplicationContext, control ))
{
return; // nothing more to do
}
// check control's ControlCollection
- EnsureControlCollectionIntercepted(defaultApplicationContext, control);
+ EnsureControlCollectionIntercepted( defaultApplicationContext, control );
}
- private static void EnsureControlCollectionIntercepted(IApplicationContext defaultApplicationContext, Control control)
+ private static void EnsureControlCollectionIntercepted( IApplicationContext defaultApplicationContext, Control control )
{
// check the collection
- ControlAccessor ctlAccessor = new ControlAccessor(control);
+ ControlAccessor ctlAccessor = new ControlAccessor( control );
ControlCollection childControls = ctlAccessor.Controls;
- if (IsDependencyInjectionAware(defaultApplicationContext, childControls))
+ if (IsDependencyInjectionAware( defaultApplicationContext, childControls ))
{
return; // nothing more to do
}
// check, if the collection's owner has already been intercepted
- ControlCollectionAccessor ctlColAccessor = new ControlCollectionAccessor(childControls);
- if (IsDependencyInjectionAware(defaultApplicationContext, ctlColAccessor.Owner))
+ ControlCollectionAccessor ctlColAccessor = new ControlCollectionAccessor( childControls );
+ if (IsDependencyInjectionAware( defaultApplicationContext, ctlColAccessor.Owner ))
{
return; // nothing more to do
}
// lookup strategy in cache
IInterceptionStrategy strategy = null;
- lock(s_cachedInterceptionStrategies)
+ lock (s_cachedInterceptionStrategies)
{
- strategy = (IInterceptionStrategy) s_cachedInterceptionStrategies[control.GetType()];
+ strategy = (IInterceptionStrategy)s_cachedInterceptionStrategies[control.GetType()];
}
-
+
if (strategy != null)
{
- strategy.Intercept(defaultApplicationContext, ctlAccessor, ctlColAccessor);
+ strategy.Intercept( defaultApplicationContext, ctlAccessor, ctlColAccessor );
}
else
{
- // lookup well-known strategies
- strategy = (IInterceptionStrategy) s_knownInterceptionStrategies[childControls.GetType()];
+ // nothing in cache - try well-known strategies for owner resp. child collection type
+ strategy = (IInterceptionStrategy)s_knownInterceptionStrategies[control.GetType()];
+ if (strategy == null)
+ {
+ strategy = (IInterceptionStrategy)s_knownInterceptionStrategies[childControls.GetType()];
+ }
+
+ // try intercept using well-known strategy
+ if (strategy != null)
+ {
+ bool bOk = strategy.Intercept( defaultApplicationContext, ctlAccessor, ctlColAccessor );
+ if (!bOk)
+ {
+ strategy = null;
+ }
+ }
+
+ // not well-known or didn't work out
if (strategy == null)
{
// probe for a strategy
@@ -144,19 +160,19 @@ namespace Spring.Web.Support
}
if (!bOk)
{
- LogManager.GetLogger(typeof(ControlInterceptor)).Warn(string.Format("dependency injection not supported for control type {0}", ctlAccessor.GetTarget().GetType()));
+ LogManager.GetLogger( typeof( ControlInterceptor ) ).Warn( string.Format( "dependency injection not supported for control type {0}", ctlAccessor.GetTarget().GetType() ) );
strategy = s_noopInterceptionStrategy;
}
}
- lock(s_cachedInterceptionStrategies)
- {
+ lock (s_cachedInterceptionStrategies)
+ {
s_cachedInterceptionStrategies[control.GetType()] = strategy;
}
- }
+ }
}
- private static bool IsDependencyInjectionAware(IApplicationContext defaultApplicationContext, object o)
+ private static bool IsDependencyInjectionAware( IApplicationContext defaultApplicationContext, object o )
{
ISupportsWebDependencyInjection diAware = o as ISupportsWebDependencyInjection;
if (diAware != null)