User: cneuwirt
Date: 2010/01/11 01:50 PM

Modified:
 /InversionOfControl/trunk/src/Castle.MicroKernel.Tests/Registration/
  DynamicParametersTestCase.cs
 /InversionOfControl/trunk/src/Castle.MicroKernel/Handlers/
  AbstractHandler.cs, DefaultGenericHandler.cs, DefaultHandler.cs
 /InversionOfControl/trunk/src/Castle.MicroKernel/Registration/
  ComponentRegistration.cs, DynamicParametersDescriptor.cs

Log:
 Added support for releasing DynamicParameters using the fluent interface.

File Changes:

Directory: /InversionOfControl/trunk/src/Castle.MicroKernel/Handlers/
=====================================================================

File [modified]: AbstractHandler.cs
Delta lines: +2 -2
===================================================================

--- 
InversionOfControl/trunk/src/Castle.MicroKernel/Handlers/DefaultGenericHandler.cs
   2010-01-11 20:00:11 UTC (rev 6631)
+++ 
InversionOfControl/trunk/src/Castle.MicroKernel/Handlers/DefaultGenericHandler.cs
   2010-01-11 20:50:42 UTC (rev 6632)
@@ -42,7 +42,7 @@
                        type2SubHandler = new Dictionary<Type, IHandler>();
                }
 
-               protected override object ResolveCore(CreationContext context)
+               protected override object ResolveCore(CreationContext context, 
bool track)
                {
                        Type implType = 
ComponentModel.Implementation.MakeGenericType(context.GenericArguments);
 
@@ -55,7 +55,7 @@
                        }
                }
 
-               public override bool Release(object instance)
+               public override bool ReleaseCore(object instance)
                {
                        Type genericType = ProxyUtil.GetUnproxiedType(instance);

File [modified]: DefaultGenericHandler.cs
Delta lines: +4 -3
===================================================================

--- InversionOfControl/trunk/src/Castle.MicroKernel/Handlers/DefaultHandler.cs  
2010-01-11 20:00:11 UTC (rev 6631)
+++ InversionOfControl/trunk/src/Castle.MicroKernel/Handlers/DefaultHandler.cs  
2010-01-11 20:50:42 UTC (rev 6632)
@@ -42,8 +42,9 @@
                /// is responsible for
                /// </summary>
                /// <param name="context"></param>
+               /// <param name="track"></param>
                /// <returns></returns>
-               protected override object ResolveCore(CreationContext context)
+               protected override object ResolveCore(CreationContext context, 
bool track)
                {
                        if (!context.HasAdditionalParameters)
                        {
@@ -57,7 +58,7 @@
                        {
                                object instance = 
lifestyleManager.Resolve(context);
 
-                               resCtx.Burden.SetRootInstance(instance, this, 
ComponentModel.LifecycleSteps.HasDecommissionSteps);
+                               resCtx.Burden.SetRootInstance(instance, this, 
track || ComponentModel.LifecycleSteps.HasDecommissionSteps);
 
                                context.ReleasePolicy.Track(instance, 
resCtx.Burden);
 
@@ -97,7 +98,7 @@
                /// </summary>
                /// <param name="instance"></param>
                /// <returns>true if destroyed</returns>
-               public override bool Release(object instance)
+               public override bool ReleaseCore(object instance)
                {
                        return lifestyleManager.Release(instance);

File [modified]: DefaultHandler.cs
Delta lines: +29 -50
===================================================================

--- 
InversionOfControl/trunk/src/Castle.MicroKernel/Registration/ComponentRegistration.cs
       2010-01-11 20:00:11 UTC (rev 6631)
+++ 
InversionOfControl/trunk/src/Castle.MicroKernel/Registration/ComponentRegistration.cs
       2010-01-11 20:50:42 UTC (rev 6632)
@@ -12,21 +12,19 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+using Castle.Facilities.FactorySupport;
+
 namespace Castle.MicroKernel.Registration
 {
        using System;
        using System.Collections;
        using System.Collections.Generic;
-       using System.Linq;
-
        using Castle.Core;
        using Castle.Core.Configuration;
        using Castle.Core.Interceptor;
-       using Castle.Facilities.FactorySupport;
        using Castle.MicroKernel;
        using Castle.MicroKernel.LifecycleConcerns;
        using Castle.MicroKernel.Proxy;
-       using Castle.MicroKernel.Registration.Interceptor;
 
        /// <summary>
        /// Delegate to filter component registration.
@@ -51,9 +49,9 @@
                private bool isInstanceRegistration;
                private Type serviceType;
                private Type implementation;
-               private readonly List<Type> forwardedTypes = new List<Type>();
-               private ComponentFilter unlessFilter = delegate { return false; 
};
-               private ComponentFilter ifFilter = delegate { return true; };
+               private List<Type> forwardedTypes = new List<Type>();
+               private ComponentFilter unlessFilter;
+               private ComponentFilter ifFilter;
                private readonly List<ComponentDescriptor<S>> descriptors;
                private ComponentModel componentModel;
                private bool registered;
@@ -75,7 +73,8 @@
                /// Initializes a new instance of the <see 
cref="ComponentRegistration{S}"/> class
                /// with an existing <see cref="ComponentModel"/>.
                /// </summary>
-               protected ComponentRegistration(ComponentModel componentModel) 
: this()
+               protected ComponentRegistration(ComponentModel componentModel)
+                       : this()
                {
                        if (componentModel == null)
                        {
@@ -507,49 +506,13 @@
                /// </summary>
                /// <param name="interceptors">The interceptors.</param>
                /// <returns></returns>
-               public InterceptorGroup<S> Interceptors(params 
InterceptorReference[] interceptors)
+               public Interceptor.InterceptorGroup<S> Interceptors(
+                               params InterceptorReference[] interceptors)
                {
-                       return new InterceptorGroup<S>(this, interceptors);
+                       return new Interceptor.InterceptorGroup<S>(this, 
interceptors);
                }
 
                /// <summary>
-               /// Set the interceptors for this component.
-               /// </summary>
-               /// <param name="interceptors">The interceptors.</param>
-               /// <returns></returns>
-               public ComponentRegistration<S> Interceptors(params Type[] 
interceptors)
-               {
-                       return AddDescriptor(new 
InterceptorDescriptor<S>(interceptors.Select(t => new 
InterceptorReference(t)).ToArray()));
-               }
-
-               /// <summary>
-               /// Set the interceptor for this component.
-               /// </summary>
-               /// <returns></returns>
-               public ComponentRegistration<S> Interceptors<T>() where T : 
IInterceptor
-               {
-                       return AddDescriptor(new InterceptorDescriptor<S>(new[] 
{new InterceptorReference(typeof (T))}));
-               }
-
-               /// <summary>
-               /// Set the interceptor for this component.
-               /// </summary>
-               /// <returns></returns>
-               public ComponentRegistration<S> Interceptors<T1, T2>() where T1 
: IInterceptor where T2: IInterceptor
-               {
-                       return Interceptors<T1>().Interceptors<T2>();
-               }
-
-               /// <summary>
-               /// Set the interceptor for this component.
-               /// </summary>
-               /// <returns></returns>
-               public ComponentRegistration<S> Interceptors(params string[] 
keys)
-               {
-                       return AddDescriptor(new 
InterceptorDescriptor<S>(keys.Select(k => 
InterceptorReference.ForKey(k)).ToArray()));
-               }
-
-               /// <summary>
                /// Sets the interceptor selector for this component.
                /// </summary>
                /// <param name="selector"></param>
@@ -607,10 +570,25 @@
                        return this;
                }
 
-               public ComponentRegistration<S> 
DynamicParameters(DynamicParametersDelegate action)
+               /// <summary>
+               /// Allows custom dependencies to by defined dyncamically.
+               /// </summary>
+               /// <param name="resolve">The delegate used for providing 
dynamic parameters.</param>
+               /// <returns></returns>
+               public ComponentRegistration<S> 
DynamicParameters(DynamicParametersDelegate resolve)
                {
+                       this.AddDescriptor(new 
DynamicParametersDescriptor<S>(resolve));
+                       return this;
+               }
 
-                       this.AddDescriptor(new 
DynamicParametersDescriptor<S>(action));
+               /// <summary>
+               /// Allows custom dependencies to by defined dyncamically with 
releasing capability.
+               /// </summary>
+               /// <param name="resolve">The delegate used for providing 
dynamic parameters.</param>
+               /// <returns></returns>
+               public ComponentRegistration<S> 
DynamicParameters(DynamicParametersResolveDelegate resolve)
+               {
+                       this.AddDescriptor(new 
DynamicParametersDescriptor<S>(resolve));
                        return this;
                }
 
@@ -697,7 +675,8 @@
                                        options.OmitTarget = true;
                                }
 
-                               if (ifFilter(kernel, componentModel) && 
!unlessFilter(kernel, componentModel))
+                               if ((ifFilter == null || ifFilter(kernel, 
componentModel)) &&
+                                       (unlessFilter == null || 
!unlessFilter(kernel, componentModel)))
                                {
                                        
kernel.AddCustomComponent(componentModel);

Directory: /InversionOfControl/trunk/src/Castle.MicroKernel/Registration/
=========================================================================

File [modified]: ComponentRegistration.cs
Delta lines: +10 -5
===================================================================

--- 
InversionOfControl/trunk/src/Castle.MicroKernel/Registration/DynamicParametersDescriptor.cs
 2010-01-11 20:00:11 UTC (rev 6631)
+++ 
InversionOfControl/trunk/src/Castle.MicroKernel/Registration/DynamicParametersDescriptor.cs
 2010-01-11 20:50:42 UTC (rev 6632)
@@ -20,21 +20,26 @@
        using Castle.MicroKernel.Handlers;
 
        public delegate void DynamicParametersDelegate(IKernel kernel, 
IDictionary parameters);
+       public delegate ComponentReleasingDelegate 
DynamicParametersResolveDelegate(IKernel kernel, IDictionary parameters);
 
-
        public class DynamicParametersDescriptor<S> : ComponentDescriptor<S>
        {
-               private readonly DynamicParametersDelegate action;
+               private readonly DynamicParametersResolveDelegate resolve;
                private static readonly string key = 
"component_resolving_handler";
 
-               public DynamicParametersDescriptor(DynamicParametersDelegate 
action)
+               public DynamicParametersDescriptor(DynamicParametersDelegate 
resolve)
+                       : this((k, d) => { resolve(k, d); return null; })
                {
-                       this.action = action;
                }
 
+               public 
DynamicParametersDescriptor(DynamicParametersResolveDelegate resolve)
+               {
+                       this.resolve = resolve;
+               }
+
                protected internal override void ApplyToModel(IKernel kernel, 
ComponentModel model)
                {
-                       ComponentResolvingDelegate handler = (k, c) => 
action(k, c.AdditionalParameters);
+                       ComponentResolvingDelegate handler = (k, c) => 
resolve(k, c.AdditionalParameters);
                        if (model.ExtendedProperties.Contains(key) == false)
                        {

File [modified]: DynamicParametersDescriptor.cs
Delta lines: +69 -15
===================================================================

--- 
InversionOfControl/trunk/src/Castle.MicroKernel.Tests/Registration/DynamicParametersTestCase.cs
     2010-01-11 20:00:11 UTC (rev 6631)
+++ 
InversionOfControl/trunk/src/Castle.MicroKernel.Tests/Registration/DynamicParametersTestCase.cs
     2010-01-11 20:50:42 UTC (rev 6632)
@@ -16,18 +16,33 @@
 {
        using Castle.MicroKernel.Registration;
        using Castle.MicroKernel.Tests.ClassComponents;
+
        using NUnit.Framework;
 
        [TestFixture]
-       public class DynamicParametersTestCase : RegistrationTestCaseBase
+       public class DynamicParametersTestCase
        {
+               [SetUp]
+               public void SetUp()
+               {
+                       kernel = new DefaultKernel();
+               }
+
+               [TearDown]
+               public void TearDown()
+               {
+                       kernel.Dispose();
+               }
+
+               private DefaultKernel kernel;
+
                [Test]
                public void Can_mix_registration_and_call_site_parameters()
                {
-                       Kernel.Register(
+                       kernel.Register(
                                
Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k, 
d) => d["arg1"] = "foo"));
 
-                       var component = Kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2 });
+                       var component = kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2 });
                        Assert.AreEqual(2, component.Arg2);
                        Assert.AreEqual("foo", component.Arg1);
                }
@@ -35,7 +50,7 @@
                [Test]
                public void Can_dynamically_override_services()
                {
-                       Kernel.Register(
+                       kernel.Register(
                                Component.For<ICustomer>()
                                        .ImplementedBy<CustomerImpl>()
                                        .Named("defaultCustomer"),
@@ -56,7 +71,7 @@
                                                }
                                        }));
 
-                       var component = 
Kernel.Resolve<CommonImplWithDependancy>();
+                       var component = 
kernel.Resolve<CommonImplWithDependancy>();
                        Assert.IsInstanceOf<CustomerImpl2>(component.Customer);
                }
 
@@ -65,12 +80,12 @@
                {
                        string arg1 = null;
                        int arg2 = 0;
-                       
Kernel.Register(Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k,
 d) =>
+                       
kernel.Register(Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k,
 d) =>
                        {
                                arg1 = (string)d["arg1"];
                                arg2 = (int)d["arg2"];
                        }));
-                       var component = Kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2, arg1 = "foo" });
+                       var component = kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2, arg1 = "foo" });
                        Assert.AreEqual("foo", arg1);
                        Assert.AreEqual(2, arg2);
                }
@@ -78,8 +93,8 @@
                [Test]
                public void Should_not_require_explicit_registration()
                {
-                       
Kernel.Register(Component.For<CommonSub2Impl>().LifeStyle.Transient.DynamicParameters((k,
 d) => { }));
-                       Assert.DoesNotThrow(() => 
Kernel.Resolve<CommonSub2Impl>());
+                       
kernel.Register(Component.For<CommonSub2Impl>().LifeStyle.Transient.DynamicParameters((k,
 d) => { }));
+                       Assert.DoesNotThrow(() => 
kernel.Resolve<CommonSub2Impl>());
                }
 
                [Test]
@@ -87,12 +102,12 @@
                {
                        string arg1 = "bar";
                        int arg2 = 5;
-                       
Kernel.Register(Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k,
 d) =>
+                       
kernel.Register(Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k,
 d) =>
                        {
                                d["arg1"] = arg1;
                                d["arg2"] = arg2;
                        }));
-                       var component = Kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2, arg1 = "foo" });
+                       var component = kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2, arg1 = "foo" });
                        Assert.AreEqual(arg1, component.Arg1);
                        Assert.AreEqual(arg2, component.Arg2);
                }
@@ -102,7 +117,7 @@
                {
                        string arg1 = "bar";
                        int arg2 = 5;
-                       Kernel.Register(Component.For<ClassWithArguments>()
+                       kernel.Register(Component.For<ClassWithArguments>()
                                                .LifeStyle.Transient
                                                .DynamicParameters((k, d) =>
                                                {
@@ -112,7 +127,7 @@
                                                {
                                                        d["arg2"] = arg2;
                                                }));
-                       var component = Kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2, arg1 = "foo" });
+                       var component = kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2, arg1 = "foo" });
                        Assert.AreEqual(arg1, component.Arg1);
                        Assert.AreEqual(arg2, component.Arg2);
                }
@@ -122,13 +137,52 @@
                {
                        string arg1 = "bar";
                        int arg2 = 5;
-                       
Kernel.Register(Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k,
 d) =>
+                       
kernel.Register(Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k,
 d) =>
                        {
                                d["arg1"] = arg1;
                                d["arg2"] = arg2;
                        }));
                        //Assert.DoesNotThrow(() =>
-                       Kernel.Resolve<ClassWithArguments>();//);
+                       kernel.Resolve<ClassWithArguments>();//);
                }
+
+               [Test]
+               public void Can_release_components_with_dynamic_parameters()
+               {
+                       bool releaseCalled = false;
+                       kernel.Register(
+                               
Component.For<ClassWithArguments>().LifeStyle.Transient.DynamicParameters((k, 
d) => 
+                               { 
+                                       d["arg1"] = "foo";
+                                       return kk => releaseCalled = true;
+                               }));
+                                               
+                       var component = kernel.Resolve<ClassWithArguments>(new 
{ arg2 = 2 });
+                       Assert.AreEqual(2, component.Arg2);
+                       Assert.AreEqual("foo", component.Arg1);
+
+                       kernel.ReleaseComponent(component);
+                       Assert.IsTrue(releaseCalled);
+               }
+
+               [Test]
+               public void Can_release_generics_with_dynamic_parameters()
+               {
+                       bool releaseCalled = false;
+                       kernel.Register(
+                               
Component.For(typeof(IGenericClassWithParameter<>))
+                               
.ImplementedBy(typeof(GenericClassWithParameter<>))
+                               .LifeStyle.Transient.DynamicParameters((k, d) =>
+                               {
+                                       d["name"] = "foo";
+                                       return kk => releaseCalled = true;
+                               }));
+
+                       var component = 
kernel.Resolve<IGenericClassWithParameter<int>>(new { name = "bar" });
+                       Assert.AreEqual("foo", component.Name);
+
+                       kernel.ReleaseComponent(component);
+                       Assert.IsTrue(releaseCalled);
+               }
        }
 }

Directory: /InversionOfControl/trunk/src/Castle.MicroKernel.Tests/Registration/
===============================================================================

File [modified]: DynamicParametersTestCase.cs
Delta lines: +0 -0
===================================================================

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Commits" 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-commits?hl=en.


Reply via email to