Skip to content

Commit

Permalink
module constructor injection for simpleinjector (#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
fw2568 authored Jan 24, 2022
1 parent d993293 commit 3f24470
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,8 @@ public interface IModuleHostServiceProviderFactory
{
object ConfigureServices(IServiceCollection services);
IServiceProvider ReplaceServiceProvider(object state, IServiceProvider services);

void ConfigureModule(Type moduleType, Func<IServiceProvider,object> moduleFactory);

}
}
7 changes: 4 additions & 3 deletions src/Hosuto.Hosting/Modules/Hosting/ModulesHostBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,13 @@ public IHost Build()
foreach (var module in _registeredModules)
{
if(module.Value.ModuleFactory==null)
moduleHostServicesFactory?.ConfigureModule(module.Key, module.Value.ModuleFactory);
if (moduleHostServicesFactory != null) continue;
if (module.Value.ModuleFactory == null)
services.AddSingleton(module.Key);
else
services.AddSingleton(module.Key, module.Value.ModuleFactory);
}
RegisterModulesAndHosts(services, frameworkServices);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@ public IServiceProvider ReplaceServiceProvider(object state, IServiceProvider se

return _container;
}

public void ConfigureModule(Type moduleType, Func<IServiceProvider, object> moduleFactory)
{

switch (moduleFactory)
{
case null:
_container.Register(moduleType);
break;
default:
_container.Register(moduleType, () => moduleFactory(_container) );
break;
}
}
}

}
34 changes: 34 additions & 0 deletions test/Hosuto.Hosting.Tests/Modules/Hosting/ModuleBuildingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,25 @@ public void Multiple_modules_can_be_bootstrapped_and_see_each_other()
Assert.NotNull(module.SomeModule);
}


[Fact]
public void Module_dependencies_can_be_injected_from_host_container()
{
var builder = ModulesHost.CreateDefaultBuilder();
builder.HostModule<ModuleWithConstructorInjection>();

var depMock = Mock.Of<IDep>();
var sc = new ServiceCollection();
sc.AddTransient(sp => depMock);

builder.UseServiceCollection(sc);

var host = builder.Build();
var module = host.Services.GetRequiredService<ModuleWithConstructorInjection>();

Assert.Equal(depMock,module.Dependency);
}

private class SomeModule
{
public string Environment { get; private set; }
Expand All @@ -108,6 +127,21 @@ public void ConfigureServices(IServiceCollection services, IHostingEnvironment e

}

public interface IDep
{

}

private class ModuleWithConstructorInjection
{
public IDep Dependency { get; }
public ModuleWithConstructorInjection(IDep dep)
{
Dependency = dep;
}

}

private class OtherModule
{
public SomeModule SomeModule { get; private set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,31 @@ public void Module_can_resolve_services_from_outer_container()


builder.HostModule<SomeModule>();
var host = builder.Build();
var moduleHost = host.Services.GetRequiredService<IModuleHost<SomeModule>>();
builder.Build();
var moduleHost = container.GetRequiredService<IModuleHost<SomeModule>>();

serviceMock.Verify(x=>x.CallMe());

}

[Fact]
public void Module_dependencies_can_be_injected_from_outer_container()
{
var container = new Container();

var builder = ModulesHost.CreateDefaultBuilder();
builder.UseSimpleInjector(container);
var serviceMock = Mock.Of<IService>();
container.RegisterInstance(serviceMock);


builder.HostModule<ModuleWithConstructorInjection>();

var host = builder.Build();
var module = container.GetRequiredService<ModuleWithConstructorInjection>();
Assert.Equal(module.Dependency, serviceMock);
}

// ReSharper disable once MemberCanBePrivate.Global
public interface IService
{
Expand All @@ -46,6 +64,18 @@ public void ConfigureServices(IServiceProvider sp, IServiceCollection services)
}

}


// ReSharper disable once ClassNeverInstantiated.Local
private class ModuleWithConstructorInjection
{
public IService Dependency { get; }
public ModuleWithConstructorInjection(IService dep)
{
Dependency = dep;
}

}
}


Expand Down

0 comments on commit 3f24470

Please sign in to comment.