Skip to content

Commit 144f184

Browse files
committed
Releasing 2.1.3
1 parent d950c53 commit 144f184

9 files changed

+66
-155
lines changed

package.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22

33
<PropertyGroup>
4-
<Version>2.1.2</Version>
4+
<Version>2.1.3</Version>
55
<PackageReleaseNotes>Bug fixes, dependency updates and minor performance optimizations</PackageReleaseNotes>
66
</PropertyGroup>
77

src/HostingExtension.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,28 @@
11
using Microsoft.AspNetCore.Hosting;
22
using Microsoft.Extensions.DependencyInjection;
33
using Microsoft.Extensions.DependencyInjection.Extensions;
4-
using System;
54

65
namespace Unity.Microsoft.DependencyInjection
76
{
87
public static class HostingExtension
98
{
10-
public static IWebHostBuilder UseUnityServiceProvider(this IWebHostBuilder hostBuilder, IUnityContainer container = null)
11-
{
12-
return UseUnityServiceProvider(hostBuilder, c => c.UnityContainer = container);
13-
}
9+
private static ServiceProviderFactory _factory;
1410

15-
public static IWebHostBuilder UseUnityServiceProvider(this IWebHostBuilder hostBuilder, Action<UnityConfigurationOptions> config)
11+
public static IWebHostBuilder UseUnityServiceProvider(this IWebHostBuilder hostBuilder, IUnityContainer container = null)
1612
{
17-
var factory = new ServiceProviderFactory(config);
13+
_factory = new ServiceProviderFactory(container);
1814

1915
#if NETCOREAPP1_1
2016
return hostBuilder.ConfigureServices((services) =>
2117
{
22-
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IUnityContainer>>(factory));
23-
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IServiceCollection>>(factory));
18+
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IUnityContainer>>(_factory));
19+
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IServiceCollection>>(_factory));
2420
});
2521
#else
2622
return hostBuilder.ConfigureServices((context, services) =>
2723
{
28-
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IUnityContainer>>(factory));
29-
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IServiceCollection>>(factory));
24+
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IUnityContainer>>(_factory));
25+
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IServiceCollection>>(_factory));
3026
});
3127
#endif
3228
}

src/ServiceProvider.cs

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,31 @@
44

55
namespace Unity.Microsoft.DependencyInjection
66
{
7-
public class ServiceProvider : IServiceProvider,
8-
IServiceScopeFactory,
9-
IServiceScope,
7+
public class ServiceProvider : IServiceProvider,
8+
IServiceScopeFactory,
9+
IServiceScope,
1010
IDisposable
1111
{
12-
private readonly UnityConfigurationOptions _options;
12+
private IUnityContainer _container;
1313

14-
internal ServiceProvider(UnityConfigurationOptions options)
14+
15+
internal ServiceProvider(IUnityContainer container)
1516
{
16-
_options = options;
17-
_options.UnityContainer.RegisterInstance<IServiceScope>(this, new ExternallyControlledLifetimeManager());
18-
_options.UnityContainer.RegisterInstance<IServiceProvider>(this, new ExternallyControlledLifetimeManager());
19-
_options.UnityContainer.RegisterInstance<IServiceScopeFactory>(this, new ExternallyControlledLifetimeManager());
17+
_container = container;
18+
_container.RegisterInstance<IServiceScope>(this, new ExternallyControlledLifetimeManager());
19+
_container.RegisterInstance<IServiceProvider>(this, new ExternallyControlledLifetimeManager());
20+
_container.RegisterInstance<IServiceScopeFactory>(this, new ExternallyControlledLifetimeManager());
2021
}
2122

2223
#region IServiceProvider
2324

2425
public object GetService(Type serviceType)
2526
{
26-
ResolutionParameters parameters = new ResolutionParameters { Type = serviceType };
27-
28-
_options.ResolveConfiguration?.Invoke(parameters);
29-
3027
try
3128
{
32-
return _options.UnityContainer.Resolve(parameters.Type, parameters.Name, parameters.ResolverOverrides ?? Array.Empty<Resolution.ResolverOverride>());
33-
}
34-
catch
35-
{
36-
parameters.ResolutionFailureHanlder?.Invoke(serviceType);
29+
return _container.Resolve(serviceType);
3730
}
31+
catch { /* Ignore */}
3832

3933
return null;
4034
}
@@ -46,10 +40,7 @@ public object GetService(Type serviceType)
4640

4741
public IServiceScope CreateScope()
4842
{
49-
var childOptions = _options.With(_options.UnityContainer.CreateChildContainer());
50-
childOptions.CreateScope?.Invoke(childOptions);
51-
52-
return new ServiceProvider(childOptions);
43+
return new ServiceProvider(_container.CreateChildContainer());
5344
}
5445

5546
#endregion
@@ -66,15 +57,13 @@ public IServiceScope CreateScope()
6657

6758
public static IServiceProvider ConfigureServices(IServiceCollection services)
6859
{
69-
var container = new UnityContainer().AddExtension(new MdiExtension())
70-
.AddServices(services);
71-
72-
return new ServiceProvider(new UnityConfigurationOptions { UnityContainer = container });
60+
return new ServiceProvider(new UnityContainer().AddExtension(new MdiExtension())
61+
.AddServices(services));
7362
}
7463

7564
public static explicit operator UnityContainer(ServiceProvider c)
7665
{
77-
return (UnityContainer)c._options.UnityContainer;
66+
return (UnityContainer)c._container;
7867
}
7968

8069
#endregion
@@ -88,14 +77,11 @@ public void Dispose()
8877
GC.SuppressFinalize(this);
8978
}
9079

91-
protected virtual void Dispose(bool _)
92-
{
93-
_options.UnityContainer?.Dispose();
94-
}
95-
96-
~ServiceProvider()
80+
private void Dispose(bool _)
9781
{
98-
Dispose(false);
82+
IDisposable disposable = _container;
83+
_container = null;
84+
disposable?.Dispose();
9985
}
10086

10187
#endregion

src/ServiceProviderExtensions.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@ public static class ServiceProviderExtensions
1717
/// <returns>The <see cref="ServiceProvider"/>.</returns>
1818
public static IServiceProvider BuildServiceProvider(this IServiceCollection services, bool validateScopes = false)
1919
{
20-
var container = new UnityContainer().AddExtension(new MdiExtension())
21-
.AddServices(services);
22-
23-
return new ServiceProvider(new UnityConfigurationOptions { UnityContainer = container });
20+
return new ServiceProvider(new UnityContainer().AddExtension(new MdiExtension())
21+
.AddServices(services));
2422
}
2523

2624
/// <summary>
@@ -32,10 +30,8 @@ public static IServiceProvider BuildServiceProvider(this IServiceCollection serv
3230
/// <returns>Service provider</returns>
3331
public static IServiceProvider BuildServiceProvider(this IServiceCollection services, IUnityContainer container)
3432
{
35-
container.AddExtension(new MdiExtension())
36-
.AddServices(services);
37-
38-
return new ServiceProvider(new UnityConfigurationOptions { UnityContainer = container });
33+
return new ServiceProvider(container.AddExtension(new MdiExtension())
34+
.AddServices(services));
3935
}
4036

4137
/// <summary>
@@ -47,10 +43,8 @@ public static IServiceProvider BuildServiceProvider(this IServiceCollection serv
4743
/// <returns>Service provider</returns>
4844
public static IServiceProvider BuildServiceProvider(this IUnityContainer container, IServiceCollection services)
4945
{
50-
container.AddExtension(new MdiExtension())
51-
.AddServices(services);
52-
53-
return new ServiceProvider(new UnityConfigurationOptions { UnityContainer = container });
46+
return new ServiceProvider(container.AddExtension(new MdiExtension())
47+
.AddServices(services));
5448
}
5549
}
5650
}

src/ServiceProviderFactory.cs

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1-
using Microsoft.Extensions.DependencyInjection;
2-
using System;
1+
using System;
2+
using Microsoft.Extensions.DependencyInjection;
33
using Unity.Lifetime;
44

55
namespace Unity.Microsoft.DependencyInjection
66
{
77
public class ServiceProviderFactory : IServiceProviderFactory<IUnityContainer>,
88
IServiceProviderFactory<IServiceCollection>
99
{
10-
private readonly Action<UnityConfigurationOptions> _config;
10+
private readonly IUnityContainer _container;
1111

12-
public ServiceProviderFactory(Action<UnityConfigurationOptions> config)
12+
public ServiceProviderFactory(IUnityContainer container)
1313
{
14-
_config = config;
14+
_container = container ?? new UnityContainer();
15+
16+
_container.RegisterInstance<IServiceProviderFactory<IUnityContainer>>(this, new ContainerControlledLifetimeManager());
17+
_container.RegisterInstance<IServiceProviderFactory<IServiceCollection>>(this, new ExternallyControlledLifetimeManager());
1518
}
1619

1720
public IServiceProvider CreateServiceProvider(IUnityContainer container)
1821
{
19-
return new ServiceProvider(CreateOptions().With(container));
22+
return new ServiceProvider(container);
2023
}
2124

2225
public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder)
@@ -26,36 +29,22 @@ public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilde
2629

2730
IUnityContainer IServiceProviderFactory<IUnityContainer>.CreateBuilder(IServiceCollection services)
2831
{
29-
return CreateServiceProviderContainer(services).UnityContainer;
32+
return CreateServiceProviderContainer(services);
3033
}
3134

3235
IServiceCollection IServiceProviderFactory<IServiceCollection>.CreateBuilder(IServiceCollection services)
3336
{
3437
return services;
3538
}
3639

37-
private UnityConfigurationOptions CreateServiceProviderContainer(IServiceCollection services)
38-
{
39-
var options = CreateOptions();
40-
options.UnityContainer.AddServices(services);
41-
return options;
42-
}
4340

44-
private UnityConfigurationOptions CreateOptions()
41+
private IUnityContainer CreateServiceProviderContainer(IServiceCollection services)
4542
{
46-
var options = new UnityConfigurationOptions();
47-
_config(options);
48-
options.UnityContainer = options.UnityContainer ?? new UnityContainer();
49-
ConfigureContainer(options.UnityContainer);
43+
var container = _container.CreateChildContainer();
44+
new ServiceProviderFactory(container);
5045

51-
return options;
52-
}
53-
54-
private void ConfigureContainer(IUnityContainer container)
55-
{
56-
container.AddExtension(new MdiExtension());
57-
container.RegisterInstance<IServiceProviderFactory<IUnityContainer>>(this, new ContainerControlledLifetimeManager());
58-
container.RegisterInstance<IServiceProviderFactory<IServiceCollection>>(this, new ExternallyControlledLifetimeManager());
46+
return container.AddExtension(new MdiExtension())
47+
.AddServices(services);
5948
}
6049
}
6150
}

src/Unity.Microsoft.DependencyInjection.csproj

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<Import Project="..\package.props" />
44

55
<PropertyGroup>
6-
<FileVersion>2.1.2.1</FileVersion>
7-
<AssemblyVersion>2.1.2.1</AssemblyVersion>
6+
<FileVersion>$(Version).0</FileVersion>
7+
<AssemblyVersion>$(Version).0</AssemblyVersion>
88
<PackageId>Unity.Microsoft.DependencyInjection</PackageId>
99
<Description>Unity for Microsoft Dependency Injection framework.</Description>
1010
<Copyright>Copyright © Unity Container Project 2018</Copyright>
@@ -19,13 +19,11 @@
1919
<RootNamespace>Unity.Microsoft.DependencyInjection</RootNamespace>
2020
<UnityAbstractions>..\..\Abstractions\src\Unity.Abstractions.csproj</UnityAbstractions>
2121
<UnityContainer>..\..\Container\src\Unity.Container.csproj</UnityContainer>
22-
<Version>2.1.2.1</Version>
23-
<PackageReleaseNotes>Extended to allow for resolution customization. Updated error language to english.</PackageReleaseNotes>
2422
</PropertyGroup>
2523

2624

2725
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
28-
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
26+
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
2927
<TargetFramework>netstandard2.0</TargetFramework>
3028
<DebugType>Full</DebugType>
3129
</PropertyGroup>
@@ -52,17 +50,17 @@
5250
</ItemGroup>
5351

5452
<ItemGroup Condition="'$(TargetFramework)' != '' AND '$(TargetFramework)' == 'netstandard2.0' ">
55-
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.1.1" />
56-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.1.1" />
53+
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
54+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.2.0" />
5755
</ItemGroup>
5856

5957

6058
<ItemGroup Condition="!Exists('$(UnityAbstractions)')">
61-
<PackageReference Include="Unity.Abstractions" Version="3.3.1" />
59+
<PackageReference Include="Unity.Abstractions" Version="$(UnityAbstractionsVersion)" />
6260
</ItemGroup>
6361

6462
<ItemGroup Condition="!Exists('$(UnityContainer)')">
65-
<PackageReference Include="Unity.Container" Version="5.8.9" />
63+
<PackageReference Include="Unity.Container" Version="$(UnityContainerVersion)" />
6664
</ItemGroup>
6765

6866
</Project>

src/UnityConfigurationOptions.cs

Lines changed: 0 additions & 53 deletions
This file was deleted.

tests/GitHub.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace Unity.Microsoft.DependencyInjection.Tests
88
{
9-
public class GitHubIssues
9+
public class IssuesOnGitHub
1010
{
1111
public interface IScopedService
1212
{
@@ -85,7 +85,7 @@ public void Issue_29_Factory()
8585

8686

8787
[Fact]
88-
public void Test2_failing()
88+
public void Issue_28()
8989
{
9090

9191
var serviceCollection = new ServiceCollection();
@@ -95,10 +95,11 @@ public void Test2_failing()
9595

9696
IUnityContainer container = new UnityContainer().CreateChildContainer();
9797

98-
var factory = new ServiceProviderFactory(c => c.UnityContainer = container);
98+
var factory = new ServiceProviderFactory(container);
9999

100100
var sp = factory.CreateServiceProvider(serviceCollection);
101101
var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
102+
var httpFactory0 = sp.GetRequiredService<IHttpClientFactory>();
102103
using (var scope = scopeFactory.CreateScope())
103104
{
104105
var httpFactory = scope.ServiceProvider.GetRequiredService<IHttpClientFactory>();

0 commit comments

Comments
 (0)