Skip to content

Commit

Permalink
Merge pull request #17 from JuergenGutsch/feature/aspnetcore-integration
Browse files Browse the repository at this point in the history
fixes #6
  • Loading branch information
peterbucher committed Mar 30, 2018
2 parents a3b17a4 + 1f1d30c commit 15b20a9
Show file tree
Hide file tree
Showing 154 changed files with 25,928 additions and 2,609 deletions.
Expand Up @@ -10,13 +10,6 @@ namespace LightCore.Integration.AspNetCore.Lifecycle
/// </summary>
public class HttpRequestLifecycle : ILifecycle
{
private readonly IHttpContextAccessor _httpContext;

public HttpRequestLifecycle(IHttpContextAccessor httpContext)
{
_httpContext = httpContext;
}

/// <summary>
/// Contains the lock object for instance creation.
/// </summary>
Expand All @@ -34,7 +27,8 @@ public HttpRequestLifecycle(IHttpContextAccessor httpContext)
/// <param name="newInstanceResolver">The resolve function for a new instance.</param>
public object ReceiveInstanceInLifecycle(Func<object> newInstanceResolver)
{
var context = _httpContext.HttpContext;
var httpContext = new HttpContextAccessor();
var context = httpContext.HttpContext;

lock (_lock)
{
Expand Down
16 changes: 11 additions & 5 deletions LightCore.Integration.AspNetCore/LightCoreExtension.cs
@@ -1,24 +1,29 @@
using System;
using System.Reflection;
using LightCore.Integration.AspNetCore.Lifecycle;
using LightCore.Lifecycle;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace LightCore.Integration.AspNetCore
{
public static class LightCoreExtension
{
public static void Populate(this IContainerBuilder builder, IServiceCollection services, IHttpContextAccessor httpContextAccessor)
public static IServiceCollection AddLightCore(this IServiceCollection services, Action<ContainerBuilder> configurationAction = null)
{
return services.AddSingleton<IServiceProviderFactory<ContainerBuilder>>(new LightCoreServiceProviderFactory(configurationAction));
}

public static void Populate(this IContainerBuilder builder, IServiceCollection services)
{
builder.RegisterFactory<IServiceProvider>(container => new LightCoreServiceProvider(container))
.ControlledBy<SingletonLifecycle>();
builder.RegisterFactory<IServiceScopeFactory>(container => new LightCoreServiceScopeFactory(container))
.ControlledBy<SingletonLifecycle>();

RegisterServices(builder, services, httpContextAccessor);
RegisterServices(builder, services);
}

private static void RegisterServices(IContainerBuilder builder, IServiceCollection services, IHttpContextAccessor httpContextAccessor)
private static void RegisterServices(IContainerBuilder builder, IServiceCollection services)
{
foreach (var serviceDescriptor in services)
{
Expand All @@ -28,7 +33,7 @@ private static void RegisterServices(IContainerBuilder builder, IServiceCollecti
Register(builder, serviceDescriptor, new SingletonLifecycle());
break;
case ServiceLifetime.Scoped:
Register(builder, serviceDescriptor, new HttpRequestLifecycle(httpContextAccessor));
Register(builder, serviceDescriptor, new HttpRequestLifecycle());
break;
case ServiceLifetime.Transient:
Register(builder, serviceDescriptor, new TransientLifecycle());
Expand All @@ -39,6 +44,7 @@ private static void RegisterServices(IContainerBuilder builder, IServiceCollecti

private static void Register(IContainerBuilder builder, ServiceDescriptor serviceDescriptor, ILifecycle lifecycle)
{

if (serviceDescriptor.ImplementationType != null)
{
builder.Register(serviceDescriptor.ServiceType, serviceDescriptor.ImplementationType)
Expand Down
55 changes: 53 additions & 2 deletions LightCore.Integration.AspNetCore/LightCoreServiceProvider.cs
@@ -1,8 +1,9 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace LightCore.Integration.AspNetCore
{
public class LightCoreServiceProvider : IServiceProvider
public class LightCoreServiceProvider : IServiceProvider, ISupportRequiredService
{
private readonly IContainer _container;

Expand All @@ -11,9 +12,59 @@ internal LightCoreServiceProvider(IContainer container)
_container = container;
}

public object GetRequiredService(Type serviceType)
{
return _container.Resolve(serviceType);
}

public object GetService(Type serviceType)
{
return _container.Resolve(serviceType);
}
}


public class LightCoreServiceProviderFactory : IServiceProviderFactory<ContainerBuilder>
{
private readonly Action<ContainerBuilder> _configurationAction;

/// <summary>
/// Initializes a new instance of the <see cref="AutofacServiceProviderFactory"/> class.
/// </summary>
/// <param name="configurationAction">Action on a <see cref="ContainerBuilder"/> that adds component registrations to the conatiner.</param>
public LightCoreServiceProviderFactory(Action<ContainerBuilder> configurationAction = null)
{
_configurationAction = configurationAction ?? (builder => { });
}

/// <summary>
/// Creates a container builder from an <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
/// </summary>
/// <param name="services">The collection of services</param>
/// <returns>A container builder that can be used to create an <see cref="T:System.IServiceProvider" />.</returns>
public ContainerBuilder CreateBuilder(IServiceCollection services)
{
var builder = new ContainerBuilder();

builder.Populate(services);

_configurationAction(builder);

return builder;
}

/// <summary>
/// Creates an <see cref="T:System.IServiceProvider" /> from the container builder.
/// </summary>
/// <param name="containerBuilder">The container builder</param>
/// <returns>An <see cref="T:System.IServiceProvider" /></returns>
public IServiceProvider CreateServiceProvider(ContainerBuilder containerBuilder)
{
if (containerBuilder == null) throw new ArgumentNullException(nameof(containerBuilder));

var container = containerBuilder.Build();

return new LightCoreServiceProvider(container);
}
}
}
11 changes: 10 additions & 1 deletion LightCore.sln
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26621.2
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".shared", ".shared", "{0C628DF3-B0E8-4D3F-95A1-3968FFFF18A0}"
ProjectSection(SolutionItems) = preProject
Expand Down Expand Up @@ -45,6 +45,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Integrations", "Integration
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LightCore.Integration.AspNet.Tests", "LightCore.Integration.AspNet.Tests\LightCore.Integration.AspNet.Tests.csproj", "{4CB43E3E-711F-4812-8E7B-0AC0B96E75F5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{962F8B81-C031-44C6-9060-0C488E86673C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LightCore.Integration.AspNetCore.Sample", "Samples\LightCore.Integration.AspNetCore.Sample\LightCore.Integration.AspNetCore.Sample.csproj", "{1D7BC52E-6552-4774-82E8-1B7928980FE8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -95,6 +99,10 @@ Global
{4CB43E3E-711F-4812-8E7B-0AC0B96E75F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4CB43E3E-711F-4812-8E7B-0AC0B96E75F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4CB43E3E-711F-4812-8E7B-0AC0B96E75F5}.Release|Any CPU.Build.0 = Release|Any CPU
{1D7BC52E-6552-4774-82E8-1B7928980FE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1D7BC52E-6552-4774-82E8-1B7928980FE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1D7BC52E-6552-4774-82E8-1B7928980FE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1D7BC52E-6552-4774-82E8-1B7928980FE8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -109,6 +117,7 @@ Global
{EF99855C-60B8-433D-A5D9-0A8D4190E2BE} = {57786DD9-9F98-4328-BD58-F6EC45411D7E}
{662E4EA4-F6BA-4AA8-9DDA-BF88A2FDF57E} = {FEB21646-1224-4E30-8539-C389C55541C3}
{4CB43E3E-711F-4812-8E7B-0AC0B96E75F5} = {662E4EA4-F6BA-4AA8-9DDA-BF88A2FDF57E}
{1D7BC52E-6552-4774-82E8-1B7928980FE8} = {962F8B81-C031-44C6-9060-0C488E86673C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D78A2B92-CF6C-4237-88BE-664A4AE0DA74}
Expand Down
22 changes: 11 additions & 11 deletions LightCore/ContainerBuilder.cs
Expand Up @@ -91,14 +91,14 @@ public ContainerBuilder()
public IContainer Build()
{
var allRegistrationSources = new List<IRegistrationSource>()
{
new OpenGenericRegistrationSource(this._registrationContainer),
new EnumerableRegistrationSource(this._registrationContainer),
new ArrayRegistrationSource(this._registrationContainer),
new ConcreteTypeRegistrationSource()
};

allRegistrationSources.Add(new FactoryRegistrationSource(this._registrationContainer));
{
new OpenGenericRegistrationSource(this._registrationContainer),
new EnumerableRegistrationSource(this._registrationContainer),
new ArrayRegistrationSource(this._registrationContainer),
new ConcreteTypeRegistrationSource(),
new FactoryRegistrationSource(this._registrationContainer)
};


this._registrationContainer.RegistrationSources = allRegistrationSources;

Expand Down Expand Up @@ -317,9 +317,9 @@ public IFluentRegistration Register(Type typeOfContract, Type typeOfImplementati
return this.AddToRegistrationFluent(new RegistrationItem(typeOfContract)
{
Activator = new ReflectionActivator(
typeOfImplementation,
this._bootStrappingContainer.Resolve<IConstructorSelector>(),
this._bootStrappingContainer.Resolve<IArgumentCollector>()),
typeOfImplementation,
this._bootStrappingContainer.Resolve<IConstructorSelector>(),
this._bootStrappingContainer.Resolve<IArgumentCollector>()),
Lifecycle = this._defaultLifecycleFunction(),
ImplementationType = typeOfImplementation
});
Expand Down
Expand Up @@ -31,15 +31,8 @@ internal class EnumerableRegistrationSource : IRegistrationSource
{
get
{
return contractType => contractType.IsGenericEnumerable()
&&
((this._registrationContainer.HasRegistration(
contractType.GetGenericArguments().FirstOrDefault()))
||
// Use ConcreteTypeRegistrationSource.
(this._registrationContainer.IsSupportedByRegistrationSource(
contractType.GetGenericArguments().FirstOrDefault())));

// Don't check the generic arguments, to ensure to create enumerables anyway.
return contractType => contractType.IsGenericEnumerable();
}
}

Expand Down Expand Up @@ -76,17 +69,18 @@ public RegistrationItem GetRegistrationFor(Type contractType, IContainer contain
private static IEnumerable ResolveEnumerable(Type contractType, IContainer container)
{
Type genericArgument = contractType.GetGenericArguments().FirstOrDefault();

object[] resolvedInstances = container.ResolveAll(genericArgument).ToArray();

Type openListType = typeof(List<>);
Type closedListType = openListType.MakeGenericType(genericArgument);

var list = (IList)Activator.CreateInstance(closedListType);

foreach(var instance in resolvedInstances)
var resolvedInstances = container.ResolveAll(genericArgument).ToArray();
if (resolvedInstances != null)
{
list.Add(instance);
foreach (var instance in resolvedInstances)
{
list.Add(instance);
}
}

return list;
Expand Down
Expand Up @@ -86,10 +86,9 @@ public RegistrationItem GetRegistrationFor(Type contractType, IContainer contain
var closedGenericRegistration = new RegistrationItem(contractType)
{
Activator = new ReflectionActivator(
implementationType,
container.Resolve<IConstructorSelector>(),
container.Resolve<IArgumentCollector>()
),
implementationType,
container.Resolve<IConstructorSelector>(),
container.Resolve<IArgumentCollector>()),
ImplementationType = implementationType
};

Expand Down
@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNetCore.Mvc;
using LightCore.Integration.AspNetCore.Sample.Models;

namespace LightCore.AspNetCore.IntegrationSample.Controllers
namespace LightCore.Integration.AspNetCore.Sample.Controllers
{
public class HomeController : Controller
{
Expand All @@ -29,7 +31,7 @@ public IActionResult Contact()

public IActionResult Error()
{
return View();
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.1" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
</ItemGroup>

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\LightCore.Integration.AspNetCore\LightCore.Integration.AspNetCore.csproj" />
<ProjectReference Include="..\..\LightCore\LightCore.csproj" />
</ItemGroup>

</Project>
@@ -0,0 +1,11 @@
using System;

namespace LightCore.Integration.AspNetCore.Sample.Models
{
public class ErrorViewModel
{
public string RequestId { get; set; }

public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}
19 changes: 19 additions & 0 deletions Samples/LightCore.Integration.AspNetCore.Sample/Program.cs
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace LightCore.Integration.AspNetCore.Sample
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureServices(services => services.AddLightCore())
.UseStartup<Startup>()
.Build();
}
}

0 comments on commit 15b20a9

Please sign in to comment.