Example #1
0
        public static IServiceProvider Overlay <TService>(this IServiceProvider provider, TService newService)
        {
            // default to adding to existing overlay, otherwise create the overlay
            var overlay = provider as OverlayServiceProvider;

            if (overlay == null)
            {
                overlay = new OverlayServiceProvider()
                {
                    Parent = provider
                };
            }

            overlay.OverlayedServices[typeof(TService)] = newService;
            return(overlay);
        }
Example #2
0
        public static IServiceProvider Overlay <TService>(this IServiceProvider provider, TService newService) where TService : class
        {
            var internalServiceDescriptors = provider.GetService <IList <ServiceDescriptor> >();

            if (internalServiceDescriptors != null)
            {
                // we can use .NET's API for this, kind of
                var newServColl = new ServiceCollection();
                foreach (var serviceDescriptor in internalServiceDescriptors)
                {
                    if (serviceDescriptor.ServiceType == typeof(TService) ||
                        serviceDescriptor.ServiceType == typeof(IList <ServiceDescriptor>))
                    {
                        continue;
                    }

                    ServiceDescriptor newDescriptor = null;
                    if (serviceDescriptor.Lifetime == ServiceLifetime.Singleton)
                    {
                        try
                        {
                            newDescriptor = new ServiceDescriptor(serviceDescriptor.ServiceType, provider.GetService(serviceDescriptor.ServiceType));
                        }
                        catch { }
                    }

                    if (newDescriptor == null)
                    {
                        if (serviceDescriptor.ImplementationType != null)
                        {
                            newDescriptor = new ServiceDescriptor(serviceDescriptor.ServiceType, serviceDescriptor.ImplementationType, serviceDescriptor.Lifetime);
                        }
                        else if (serviceDescriptor.ImplementationInstance != null && serviceDescriptor.Lifetime == ServiceLifetime.Singleton)
                        {
                            newDescriptor = new ServiceDescriptor(serviceDescriptor.ServiceType, serviceDescriptor.ImplementationInstance);
                        }
                        else if (serviceDescriptor.ImplementationFactory != null)
                        {
                            newDescriptor = new ServiceDescriptor(serviceDescriptor.ServiceType, serviceDescriptor.ImplementationFactory, serviceDescriptor.Lifetime);
                        }
                    }

                    newServColl.Add(newDescriptor);
                }

                newServColl.AddSingleton(typeof(TService), newService);
                return(newServColl.BuildServiceProvider());
            }
            else
            {
                // create a thin overlay
                // default to adding to existing overlay, otherwise create the overlay
                var overlay = provider as OverlayServiceProvider;
                if (overlay == null)
                {
                    overlay = new OverlayServiceProvider()
                    {
                        Parent = provider
                    };
                }

                overlay.OverlayedServices[typeof(TService)] = newService;
                return(overlay);
            }
        }