Skip to content

Commit

Permalink
✨ Add Ninject IoC adapter
Browse files Browse the repository at this point in the history
- Add Ninject adapter
- Support some simplified connector registration cases
- Add tests for ninject adapter
- Support tail calls into the same machine in entry actions
- Add test for tail call support
  • Loading branch information
Ovan Crone committed Feb 13, 2018
1 parent 029862e commit cec2c77
Show file tree
Hide file tree
Showing 34 changed files with 616 additions and 85 deletions.
71 changes: 71 additions & 0 deletions REstate.IoC.Ninject/NinjectComponentContainer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System;
using System.Linq;
using Ninject;
using Ninject.Activation;

namespace REstate.IoC.Ninject
{
public class NinjectComponentContainer
: IComponentContainer
{
public NinjectComponentContainer(IKernel kernel)
{
Kernel = kernel;
}

protected IKernel Kernel { get; }

public void Register<T>(T instance, string name = null) where T : class
{
var binding = Kernel.Bind<T>().ToConstant(instance);

if(name is null)
return;

binding.Named(name);
}

public void Register(Type registrationType, Type implementationType, string name = null)
{
var binding = Kernel.Bind(registrationType).To(implementationType);

if(name is null)
return;

binding.Named(name);
}

public void Register<T>(FactoryMethod<T> resolver, string name = null) where T : class
{
T Resolve(IContext context) => resolver(this);

var binding = Kernel.Bind<T>().ToMethod(Resolve);

if(name is null)
return;

binding.Named(name);
}

public void RegisterComponent(IComponent component)
{
component.Register(this);
}

public T Resolve<T>(string name = null) where T : class
=> name is null ? Kernel.Get<T>() : Kernel.Get<T>(name);

public T[] ResolveAll<T>() where T : class =>
Kernel.GetAll<T>().ToArray();

void IRegistrar.Register<TBinding, TImplementation>(string name)
{
var binding = Kernel.Bind<TBinding>().To<TImplementation>();

if(name is null)
return;

binding.Named(name);
}
}
}
29 changes: 29 additions & 0 deletions REstate.IoC.Ninject/REstate.IoC.Ninject.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Authors>Ovan Crone</Authors>
<Company>Psibernetic Solutions</Company>
<Description>Ninject adapter for REstate.</Description>
<Copyright>Ovan Crone 2016</Copyright>
<PackageLicenseUrl>https://github.com/psibr/REstate/blob/v6.0/LICENSE</PackageLicenseUrl>
<Version>3.0.0</Version>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<LangVersion>latest</LangVersion>
<PackageProjectUrl>https://github.com/psibr/REstate</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>REstate</PackageTags>
<PackageIconUrl>https://github.com/psibr/REstate/blob/master/assets/icons/REstate-64.png?raw=true</PackageIconUrl>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Ninject" Version="3.3.4" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\src\REstate\REstate.csproj" />
</ItemGroup>

</Project>
14 changes: 14 additions & 0 deletions REstate.sln
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Icons", "Icons", "{EE8E30B1
assets\icons\REstate.svg = assets\icons\REstate.svg
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "REstate.IoC.Ninject", "REstate.IoC.Ninject\REstate.IoC.Ninject.csproj", "{0E9D2031-6525-4280-9961-045137637FB3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "REstate.IoC.Ninject.Tests", "test\REstate.IoC.Ninject.Tests\REstate.IoC.Ninject.Tests.csproj", "{57415F9E-37A5-439E-ADF2-8CE40AB5B267}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -105,6 +109,14 @@ Global
{D699BD4C-9005-4475-A958-3A0AC2C6F575}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D699BD4C-9005-4475-A958-3A0AC2C6F575}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D699BD4C-9005-4475-A958-3A0AC2C6F575}.Release|Any CPU.Build.0 = Release|Any CPU
{0E9D2031-6525-4280-9961-045137637FB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E9D2031-6525-4280-9961-045137637FB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E9D2031-6525-4280-9961-045137637FB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E9D2031-6525-4280-9961-045137637FB3}.Release|Any CPU.Build.0 = Release|Any CPU
{57415F9E-37A5-439E-ADF2-8CE40AB5B267}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{57415F9E-37A5-439E-ADF2-8CE40AB5B267}.Debug|Any CPU.Build.0 = Debug|Any CPU
{57415F9E-37A5-439E-ADF2-8CE40AB5B267}.Release|Any CPU.ActiveCfg = Release|Any CPU
{57415F9E-37A5-439E-ADF2-8CE40AB5B267}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -124,6 +136,8 @@ Global
{5F424F7B-4840-414D-9FA3-7700D81AD898} = {88B4B54C-3DA1-40D2-8DCB-0181DD035955}
{D699BD4C-9005-4475-A958-3A0AC2C6F575} = {90E8D167-048D-467B-81D5-1007247226A3}
{EE8E30B1-F341-4924-8B26-401DA680D213} = {85E6545C-48B6-40EB-A6C7-827E16255AA6}
{0E9D2031-6525-4280-9961-045137637FB3} = {90E8D167-048D-467B-81D5-1007247226A3}
{57415F9E-37A5-439E-ADF2-8CE40AB5B267} = {88B4B54C-3DA1-40D2-8DCB-0181DD035955}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0C35B35D-40C1-4521-BF0A-C5A6D7BFF4CD}
Expand Down
14 changes: 7 additions & 7 deletions src/Examples/Client-Server/Client/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ static async Task Main(string[] args)

Log.Logger = logger;

REstateHost.Agent.Configuration
.RegisterComponent(new GrpcRemoteHostComponent(
new GrpcHostOptions
{
Channel = new Channel("localhost", 12345, ChannelCredentials.Insecure),
UseAsDefaultEngine = true
}));
//REstateHost.Agent.Configuration
// .RegisterComponent(new GrpcRemoteHostComponent(
// new GrpcHostOptions
// {
// Channel = new Channel("localhost", 12345, ChannelCredentials.Insecure),
// UseAsDefaultEngine = true
// }));

var stateEngine = REstateHost.Agent
.GetStateEngine<string, string>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
<Company>Psibernetic Solutions</Company>
<Description>Concurrency primitives such as Semaphores and mutexes build on REstate Machines.</Description>
<Copyright>Ovan Crone 2016</Copyright>
<PackageLicenseUrl>https://opensource.org/licenses/MIT</PackageLicenseUrl>
<PackageLicenseUrl>https://github.com/psibr/REstate/blob/v6.0/LICENSE</PackageLicenseUrl>
<Version>3.0.0</Version>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<LangVersion>latest</LangVersion>
<PackageProjectUrl>https://github.com/psibr/REstate.Engine</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate.Engine</RepositoryUrl>
<PackageProjectUrl>https://github.com/psibr/REstate</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>REstate</PackageTags>
<PackageIconUrl>https://github.com/psibr/REstate/blob/master/assets/icons/REstate-64.png?raw=true</PackageIconUrl>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
<Company>Psibernetic Solutions</Company>
<Description>Entity Framework Core repository for REstate Machines and Schematics.</Description>
<Copyright>Ovan Crone 2016</Copyright>
<PackageLicenseUrl>https://opensource.org/licenses/MIT</PackageLicenseUrl>
<PackageLicenseUrl>https://github.com/psibr/REstate/blob/v6.0/LICENSE</PackageLicenseUrl>
<Version>3.0.0</Version>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<LangVersion>latest</LangVersion>
<PackageProjectUrl>https://github.com/psibr/REstate.Engine</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate.Engine</RepositoryUrl>
<PackageProjectUrl>https://github.com/psibr/REstate</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>REstate</PackageTags>
<RuntimeFrameworkVersion>2.0.0</RuntimeFrameworkVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
<Product>REstate</Product>
<Description>Redis storage provider for REstate's engine.</Description>
<Copyright>Ovan Crone 2016</Copyright>
<PackageLicenseUrl>https://opensource.org/licenses/MIT</PackageLicenseUrl>
<PackageProjectUrl>https://github.com/psibr/REstate.Engine</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate.Engine</RepositoryUrl>
<PackageLicenseUrl>https://github.com/psibr/REstate/blob/v6.0/LICENSE</PackageLicenseUrl>
<PackageProjectUrl>https://github.com/psibr/REstate</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>REstate</PackageTags>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
Expand Down
6 changes: 3 additions & 3 deletions src/REstate.Remote/REstate.Remote.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<Version>3.0.0</Version>
<PackageProjectUrl>https://github.com/psibr/REstate.Engine</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate.Engine</RepositoryUrl>
<PackageProjectUrl>https://github.com/psibr/REstate</PackageProjectUrl>
<RepositoryUrl>https://github.com/psibr/REstate</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>REstate</PackageTags>
<Authors>Ovan Crone</Authors>
<Company>Psibernetic Solutions</Company>
<Product>REstate</Product>
<Description>Provides gRPC/HTTP2 interconnect support for REstate's engine in either client or server configuration.</Description>
<Copyright>Ovan Crone 2016</Copyright>
<PackageLicenseUrl>https://opensource.org/licenses/MIT</PackageLicenseUrl>
<PackageLicenseUrl>https://github.com/psibr/REstate/blob/v6.0/LICENSE</PackageLicenseUrl>
<LangVersion>latest</LangVersion>
<PackageIconUrl>https://github.com/psibr/REstate/blob/master/assets/icons/REstate-64.png?raw=true</PackageIconUrl>
</PropertyGroup>
Expand Down
13 changes: 13 additions & 0 deletions src/REstate/Engine/Connectors/ConnectorConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace REstate.Engine.Connectors
{
public class ConnectorConfiguration
: IConnectorConfiguration
{
public ConnectorConfiguration(string identifier)
{
Identifier = identifier;
}

public string Identifier { get; }
}
}
19 changes: 13 additions & 6 deletions src/REstate/Engine/Connectors/Resolution/IConnectorResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,15 @@ public DefaultConnectorResolver(
var mappings = connectorTypeToIdentifierMappings.ToList();

var entryConnectorMappings = mappings
.Join(inner: entryConnectors,
outerKeySelector: mapping => mapping.ConnectorType,
innerKeySelector: connector => connector.GetType().GetGenericTypeDefinition(),
resultSelector: (mapping, connector) => (mapping.Identifier, Connector: connector))
.Join(inner: entryConnectors.Where(connector => connector != null),
outerKeySelector: mapping =>
mapping.ConnectorType,
innerKeySelector: connector =>
connector.GetType().IsConstructedGenericType
? connector.GetType().GetGenericTypeDefinition()
: connector.GetType(),
resultSelector: (mapping, connector) =>
(mapping.Identifier, Connector: connector))
.ToList();

EntryConnectors = entryConnectorMappings
Expand All @@ -54,9 +59,11 @@ public DefaultConnectorResolver(
.ToLookup(tuple => tuple.Identifier, tuple => tuple.Connector, connectorStringComparer);

GuardianConnectors = mappings
.Join(inner: guardianConnectors,
.Join(inner: guardianConnectors.Where(connector => connector != null),
outerKeySelector: mapping => mapping.ConnectorType,
innerKeySelector: connector => connector.GetType().GetGenericTypeDefinition(),
innerKeySelector: connector => connector.GetType().IsConstructedGenericType
? connector.GetType().GetGenericTypeDefinition()
: connector.GetType(),
resultSelector: (mapping, connector) => (mapping.Identifier, Connector: connector))
.ToLookup(kvp => kvp.Identifier, kvp => kvp.Connector, connectorStringComparer);
}
Expand Down
Loading

0 comments on commit cec2c77

Please sign in to comment.