|
1 | 1 | using System; |
2 | 2 | using Microsoft.Extensions.DependencyInjection; |
| 3 | +using Unity.Lifetime; |
3 | 4 |
|
4 | 5 | namespace Unity.Microsoft.DependencyInjection |
5 | 6 | { |
6 | | - public class ServiceProviderFactory : IServiceProviderFactory<IUnityContainer> |
| 7 | + public class ServiceProviderFactory : IServiceProviderFactory<IUnityContainer>, |
| 8 | + IServiceProviderFactory<IServiceCollection> |
7 | 9 | { |
8 | 10 | private readonly IUnityContainer _container; |
9 | 11 |
|
10 | 12 | public ServiceProviderFactory(IUnityContainer container) |
11 | 13 | { |
12 | 14 | _container = container ?? new UnityContainer(); |
13 | | - } |
14 | 15 |
|
15 | | - public IUnityContainer CreateBuilder(IServiceCollection services) |
16 | | - { |
17 | | - return _container.CreateChildContainer() |
18 | | - .AddExtension(new MdiExtension()) |
19 | | - .AddServices(services); |
| 16 | + _container.RegisterInstance<IServiceProviderFactory<IUnityContainer>>(this, new ContainerControlledLifetimeManager()); |
| 17 | + _container.RegisterInstance<IServiceProviderFactory<IServiceCollection>>(this, new ExternallyControlledLifetimeManager()); |
20 | 18 | } |
21 | 19 |
|
22 | 20 | public IServiceProvider CreateServiceProvider(IUnityContainer container) |
23 | 21 | { |
24 | 22 | return new ServiceProvider(container); |
25 | 23 | } |
| 24 | + |
| 25 | + public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder) |
| 26 | + { |
| 27 | + return new ServiceProvider(CreateServiceProviderContainer(containerBuilder)); |
| 28 | + } |
| 29 | + |
| 30 | + IUnityContainer IServiceProviderFactory<IUnityContainer>.CreateBuilder(IServiceCollection services) |
| 31 | + { |
| 32 | + return CreateServiceProviderContainer(services); |
| 33 | + } |
| 34 | + |
| 35 | + IServiceCollection IServiceProviderFactory<IServiceCollection>.CreateBuilder(IServiceCollection services) |
| 36 | + { |
| 37 | + return services; |
| 38 | + } |
| 39 | + |
| 40 | + |
| 41 | + private IUnityContainer CreateServiceProviderContainer(IServiceCollection services) |
| 42 | + { |
| 43 | + var container = _container.CreateChildContainer(); |
| 44 | + new ServiceProviderFactory(container); |
| 45 | + |
| 46 | + return container.AddExtension(new MdiExtension()) |
| 47 | + .AddServices(services); |
| 48 | + } |
26 | 49 | } |
27 | 50 | } |
0 commit comments