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.