diff --git a/src/WebApiContrib.IoC.CastleWindsor/DependencyAttribute.cs b/src/WebApiContrib.IoC.CastleWindsor/DependencyAttribute.cs
new file mode 100644
index 0000000..c6985c4
--- /dev/null
+++ b/src/WebApiContrib.IoC.CastleWindsor/DependencyAttribute.cs
@@ -0,0 +1,9 @@
+namespace WebApiContrib.IoC.CastleWindsor
+{
+ using System;
+
+ [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
+ public class DependencyAttribute : Attribute
+ {
+ }
+}
\ No newline at end of file
diff --git a/src/WebApiContrib.IoC.CastleWindsor/WebApiContrib.IoC.CastleWindsor.csproj b/src/WebApiContrib.IoC.CastleWindsor/WebApiContrib.IoC.CastleWindsor.csproj
index 1b7cc44..9cb3be9 100644
--- a/src/WebApiContrib.IoC.CastleWindsor/WebApiContrib.IoC.CastleWindsor.csproj
+++ b/src/WebApiContrib.IoC.CastleWindsor/WebApiContrib.IoC.CastleWindsor.csproj
@@ -38,15 +38,15 @@
False
- ..\..\packages\Castle.Core.3.3.1\lib\net40-client\Castle.Core.dll
+ ..\..\packages\Castle.Core.3.3.1\lib\net45\Castle.Core.dll
False
- ..\..\packages\Castle.Windsor.3.3.0\lib\net40\Castle.Windsor.dll
+ ..\..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll
False
- ..\..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll
+ ..\..\packages\Newtonsoft.Json.6.0.6\lib\net45\Newtonsoft.Json.dll
@@ -63,6 +63,9 @@
+
+
+
diff --git a/src/WebApiContrib.IoC.CastleWindsor/WindsorActionDescriptorFilterProvider.cs b/src/WebApiContrib.IoC.CastleWindsor/WindsorActionDescriptorFilterProvider.cs
new file mode 100644
index 0000000..4bf02aa
--- /dev/null
+++ b/src/WebApiContrib.IoC.CastleWindsor/WindsorActionDescriptorFilterProvider.cs
@@ -0,0 +1,32 @@
+namespace WebApiContrib.IoC.CastleWindsor
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Web.Http;
+ using System.Web.Http.Controllers;
+ using System.Web.Http.Filters;
+ using Castle.Windsor;
+
+ public class WindsorActionDescriptorFilterProvider : ActionDescriptorFilterProvider, IFilterProvider
+ {
+ private readonly IWindsorContainer container;
+
+ public WindsorActionDescriptorFilterProvider(IWindsorContainer container)
+ {
+ if (container == null)
+ {
+ throw new ArgumentNullException("container");
+ }
+
+ this.container = container;
+ }
+
+ public new IEnumerable GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
+ {
+ var filters = base.GetFilters(configuration, actionDescriptor);
+
+ return filters.Select(filter => this.container.BuildUp(filter));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/WebApiContrib.IoC.CastleWindsor/WindsorExtensions.cs b/src/WebApiContrib.IoC.CastleWindsor/WindsorExtensions.cs
new file mode 100644
index 0000000..28e73d4
--- /dev/null
+++ b/src/WebApiContrib.IoC.CastleWindsor/WindsorExtensions.cs
@@ -0,0 +1,36 @@
+namespace WebApiContrib.IoC.CastleWindsor
+{
+ using System;
+ using System.Linq;
+ using Castle.Windsor;
+
+ public static class WindsorExtensions
+ {
+ public static T BuildUp(this IWindsorContainer container, T instance) where T : class
+ {
+ if (instance == null)
+ {
+ return null;
+ }
+
+ var properties =
+ instance.GetType().GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(DependencyAttribute)));
+
+ foreach (var property in properties)
+ {
+ var value = property.GetValue(instance, null);
+
+ if (value != null)
+ {
+ continue;
+ }
+
+ var resolvedPropertyInstance = container.Resolve(property.PropertyType);
+
+ property.SetValue(instance, resolvedPropertyInstance);
+ }
+
+ return instance;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/WebApiContrib.IoC.CastleWindsor/packages.config b/src/WebApiContrib.IoC.CastleWindsor/packages.config
index 07cc27a..a154c92 100644
--- a/src/WebApiContrib.IoC.CastleWindsor/packages.config
+++ b/src/WebApiContrib.IoC.CastleWindsor/packages.config
@@ -1,8 +1,8 @@
-
-
+
+
-
+
\ No newline at end of file
diff --git a/test/WebApiContrib.IoC.CastleWindsor.Tests/WebApiContrib.IoC.CastleWindsor.Tests.csproj b/test/WebApiContrib.IoC.CastleWindsor.Tests/WebApiContrib.IoC.CastleWindsor.Tests.csproj
index 0a471ac..b60cb89 100644
--- a/test/WebApiContrib.IoC.CastleWindsor.Tests/WebApiContrib.IoC.CastleWindsor.Tests.csproj
+++ b/test/WebApiContrib.IoC.CastleWindsor.Tests/WebApiContrib.IoC.CastleWindsor.Tests.csproj
@@ -38,11 +38,11 @@
False
- ..\..\packages\Castle.Core.3.3.1\lib\net40-client\Castle.Core.dll
+ ..\..\packages\Castle.Core.3.3.1\lib\net45\Castle.Core.dll
False
- ..\..\packages\Castle.Windsor.3.3.0\lib\net40\Castle.Windsor.dll
+ ..\..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll
True
@@ -50,7 +50,7 @@
False
- ..\..\packages\Newtonsoft.Json.6.0.6\lib\net40\Newtonsoft.Json.dll
+ ..\..\packages\Newtonsoft.Json.6.0.6\lib\net45\Newtonsoft.Json.dll
False
@@ -80,6 +80,7 @@
+
diff --git a/test/WebApiContrib.IoC.CastleWindsor.Tests/WindsorContainerBuildUpExtensionTests.cs b/test/WebApiContrib.IoC.CastleWindsor.Tests/WindsorContainerBuildUpExtensionTests.cs
new file mode 100644
index 0000000..443542f
--- /dev/null
+++ b/test/WebApiContrib.IoC.CastleWindsor.Tests/WindsorContainerBuildUpExtensionTests.cs
@@ -0,0 +1,81 @@
+namespace WebApiContrib.IoC.CastleWindsor.Tests
+{
+ using Castle.MicroKernel.Registration;
+ using Castle.Windsor;
+
+ using NUnit.Framework;
+
+ [TestFixture]
+ public class WindsorContainerBuildUpExtensionTests
+ {
+ private interface IPerson
+ {
+ }
+
+ [Test]
+ public void Should_Inject_Dependency()
+ {
+ var container = new WindsorContainer();
+ container.Register(Component.For().ImplementedBy());
+
+ var instance = new TestClass();
+
+ container.BuildUp(instance);
+
+ Assert.IsInstanceOf(instance.Person);
+ }
+
+ [Test]
+ public void Should_Not_Inject_Dependency_When_Injected_Property_Is_Instantiated()
+ {
+ var container = new WindsorContainer();
+ container.Register(Component.For().ImplementedBy());
+
+ var instance = new TestClass() { Person = new PersonB() };
+
+ container.BuildUp(instance);
+
+ Assert.IsInstanceOf(instance.Person);
+ }
+
+ [Test]
+ public void Should_Not_Inject_Dependency_When_Property_Is_Not_Decorated_With_Dependency_Attribute()
+ {
+ var container = new WindsorContainer();
+ container.Register(Component.For().ImplementedBy());
+
+ var instance = new TestClass() { Person = new PersonB() };
+
+ container.BuildUp(instance);
+
+ Assert.IsNull(instance.AnotherPerson);
+ }
+
+ [Test]
+ public void Should_Return_Null_When_Type_Is_Not_Instantiated()
+ {
+ var container = new WindsorContainer();
+ container.Register(Component.For().ImplementedBy());
+
+ TestClass instance = null;
+
+ Assert.IsNull(container.BuildUp(instance));
+ }
+
+ private class TestClass
+ {
+ public IPerson AnotherPerson { get; set; }
+
+ [Dependency]
+ public IPerson Person { get; set; }
+ }
+
+ private class PersonA : IPerson
+ {
+ }
+
+ private class PersonB : IPerson
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/WebApiContrib.IoC.CastleWindsor.Tests/packages.config b/test/WebApiContrib.IoC.CastleWindsor.Tests/packages.config
index 376e85a..71354d0 100644
--- a/test/WebApiContrib.IoC.CastleWindsor.Tests/packages.config
+++ b/test/WebApiContrib.IoC.CastleWindsor.Tests/packages.config
@@ -1,11 +1,11 @@
-
-
+
+
-
-
+
+
\ No newline at end of file