Skip to content
This repository has been archived by the owner on Nov 2, 2020. It is now read-only.

Commit

Permalink
Add support for Ninject to keep and resolve aspects from container.
Browse files Browse the repository at this point in the history
  • Loading branch information
samoshkin committed Sep 27, 2011
1 parent edd2530 commit 33f3d2b
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 5 deletions.
3 changes: 2 additions & 1 deletion Snap.Ninject/NinjectAspectContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ public class NinjectAspectContainer : AspectContainer
/// </summary>
public NinjectAspectContainer()
{
Proxy = new MasterProxy();
_kernel = new StandardKernel(_interceptor);
Proxy = new MasterProxy();
Proxy.Container = new NinjectServiceLocatorAdapter(_kernel);
}

/// <summary>
Expand Down
34 changes: 34 additions & 0 deletions Snap.Ninject/NinjectServiceLocatorAdapter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using Microsoft.Practices.ServiceLocation;
using Ninject;

namespace Snap.Ninject
{
/// <summary>
/// This is common service locator adapter for Ninject IoC container
/// </summary>
/// <remarks>
/// Cannot use existing adapter from NInjectAdapter library distributed within CommonServiceLocator.NInjectAdapter NuGet package.
/// Existing NinjectAdapter is build for NET4.0 runtime.
/// </remarks>
public class NinjectServiceLocatorAdapter : ServiceLocatorImplBase
{
private readonly IKernel _kernel;

public NinjectServiceLocatorAdapter(IKernel kernel)
{
_kernel = kernel;
}

protected override object DoGetInstance(Type serviceType, string key)
{
return _kernel.Get(serviceType);
}

protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
{
return _kernel.GetAll(serviceType);
}
}
}
12 changes: 8 additions & 4 deletions Snap.Ninject/Snap.Ninject.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NET40-Debug|AnyCPU' ">
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
Expand All @@ -29,7 +29,7 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NET40-Release|AnyCPU' ">
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\NET40-Release\</OutputPath>
Expand Down Expand Up @@ -60,14 +60,17 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup>
<FrameworkPackageDirNinject Condition="'$(TargetFrameworkVersion)' == 'v4.0'">net40-Full</FrameworkPackageDirNinject>
<FrameworkPackageDirNinject Condition="'$(TargetFrameworkVersion)' == 'v3.5'">net35-Full</FrameworkPackageDirNinject>
<FrameworkPackageDirNinject Condition="'$(TargetFrameworkVersion)' == 'v4.0'">net40-Full</FrameworkPackageDirNinject>
<FrameworkPackageDirNinject Condition="'$(TargetFrameworkVersion)' == 'v3.5'">net35-Full</FrameworkPackageDirNinject>
</PropertyGroup>
<ItemGroup>
<Reference Include="Castle.Core, Version=2.5.1.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Castle.Core.2.5.2\lib\NET35\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference>
<Reference Include="Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.2.2.1.4\lib\$(FrameworkPackageDirNinject)\Ninject.dll</HintPath>
</Reference>
Expand All @@ -88,6 +91,7 @@
<Compile Include="AspectProxyActivationStrategy.cs" />
<Compile Include="NinjectAspectInterceptor.cs" />
<Compile Include="NinjectAspectContainer.cs" />
<Compile Include="NinjectServiceLocatorAdapter.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SampleNinjectAopConfig.cs" />
</ItemGroup>
Expand Down
1 change: 1 addition & 0 deletions Snap.Ninject/packages.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Castle.Core" version="2.5.2" />
<package id="CommonServiceLocator" version="1.0" />
<package id="Ninject" version="2.2.1.4" />
</packages>
51 changes: 51 additions & 0 deletions Snap.Tests/NinjectTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,5 +181,56 @@ public void NInject_Container_Does_Not_Support_Resolving_Aspects_From_Container(
// no failure, HandleErrorInterceptor is created via new() and intercepted
Assert.DoesNotThrow(container.Kernel.Get<IBadCode>().GiddyUp);
}

[Test]
public void Ninject_Supports_Resolving_All_Aspects_From_Container()
{
var container = new NinjectAspectContainer();

SnapConfiguration.For(container).Configure(c =>
{
c.IncludeNamespace("SnapTests.*");
c.Bind<FirstInterceptor>().To<FirstAttribute>();
c.Bind<SecondInterceptor>().To<SecondAttribute>();
c.AllAspects().KeepInContainer();
});

container.Kernel.Bind<IOrderedCode>().To<OrderedCode>();
container.Kernel.Bind<FirstInterceptor>().ToConstant(new FirstInterceptor("first_kept_in_container"));
container.Kernel.Bind<SecondInterceptor>().ToConstant(new SecondInterceptor("second_kept_in_container"));

var orderedCode = container.Kernel.Get<IOrderedCode>();
orderedCode.RunInOrder();

CollectionAssert.AreEquivalent(
OrderedCode.Actions,
new[] { "first_kept_in_container", "second_kept_in_container" });
}

[Test]
public void Ninject_Supports_Resolving_Only_Selected_Aspects_From_Container()
{
var container = new NinjectAspectContainer();

SnapConfiguration.For(container).Configure(c =>
{
c.IncludeNamespace("SnapTests.*");
c.Bind<FirstInterceptor>().To<FirstAttribute>();
c.Bind<SecondInterceptor>().To<SecondAttribute>();
c.Aspects(typeof(FirstInterceptor)).KeepInContainer();
});

container.Kernel.Bind<IOrderedCode>().To<OrderedCode>();
container.Kernel.Bind<FirstInterceptor>().ToConstant(new FirstInterceptor("first_kept_in_container"));
container.Kernel.Bind<SecondInterceptor>().ToConstant(new SecondInterceptor("second_kept_in_container"));

var orderedCode = container.Kernel.Get<IOrderedCode>();
orderedCode.RunInOrder();

// first interceptor is resolved from container, while second one is via new()
CollectionAssert.AreEquivalent(
OrderedCode.Actions,
new[] { "first_kept_in_container", "Second" });
}
}
}

0 comments on commit 33f3d2b

Please sign in to comment.