From d0648e0f10b78699e62d36ffc98c8f12807d3046 Mon Sep 17 00:00:00 2001 From: kalyan_yegnavajjula Date: Tue, 22 Sep 2015 18:00:13 +0530 Subject: [PATCH] Modified to update libraries for Framework to 4.5 and added logic for injecting properties in Filters --- .../DependencyAttribute.cs | 9 +++ .../WebApiContrib.IoC.CastleWindsor.csproj | 9 ++- .../WindsorActionDescriptorFilterProvider.cs | 32 ++++++++ .../WindsorExtensions.cs | 36 +++++++++ .../packages.config | 6 +- ...bApiContrib.IoC.CastleWindsor.Tests.csproj | 7 +- .../WindsorContainerBuildUpExtensionTests.cs | 81 +++++++++++++++++++ .../packages.config | 8 +- 8 files changed, 175 insertions(+), 13 deletions(-) create mode 100644 src/WebApiContrib.IoC.CastleWindsor/DependencyAttribute.cs create mode 100644 src/WebApiContrib.IoC.CastleWindsor/WindsorActionDescriptorFilterProvider.cs create mode 100644 src/WebApiContrib.IoC.CastleWindsor/WindsorExtensions.cs create mode 100644 test/WebApiContrib.IoC.CastleWindsor.Tests/WindsorContainerBuildUpExtensionTests.cs 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