예제 #1
0
        public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
        {
            // Create a fresh service registry...
            var serviceRegistry = new NamedServiceRegistry <TService>();

            // The inherited class maps service names to factory functions...
            AddNamedServices(configuration, serviceRegistry);

            // Register the named service factory for injection by the host application...
            services.AddSingleton <INamedServiceFactory <TService> >(new NamedServiceFactory <TService>(serviceRegistry));
        }
        public void Can_Add_MixtureOf_Registrations()
        {
            var namedRegistrations = new NamedServiceRegistry<AnimalService>(GetDefaultServiceProvider());
            namedRegistrations.AddSingleton("A", new AnimalService() { SomeProperty = "A" });
            namedRegistrations.AddSingleton("B", new LionService() { SomeProperty = "B", SomeOtherProperty = true });
            namedRegistrations.AddSingleton<TigerService>("C");
            namedRegistrations.AddSingleton("D");

            Assert.NotNull(namedRegistrations["A"]);
            Assert.NotNull(namedRegistrations["B"]);
            Assert.NotNull(namedRegistrations["C"]);
        }
        public void Can_Dispose_Of_SingletonInstances()
        {
            var disposable = new DisposableTigerService() { SomeProperty = "Should be disposed." };
            var disposableShouldNotBeDisposed = new DisposableTigerService() { SomeProperty = "Should NOT be disposed." };

            using (var namedRegistrations = new NamedServiceRegistry<AnimalService>(GetDefaultServiceProvider()))
            {
                namedRegistrations.AddSingleton("A", disposableShouldNotBeDisposed);
                namedRegistrations.AddSingleton("B", disposable, registrationOwnsInstance: true); // This param defaults to false, must specifiy true if you want instance to be disposed by service provider dispose().
            }

            Assert.False(disposableShouldNotBeDisposed.WasDisposed);
            Assert.True(disposable.WasDisposed);
        }
        public void Can_Add_Singleton_Type_Registrations()
        {
            var namedRegistrations = new NamedServiceRegistry<AnimalService>(GetDefaultServiceProvider());
            namedRegistrations.AddSingleton("A");
            namedRegistrations.AddSingleton<BearService>("B");

            var registeredA = namedRegistrations["A"];

            Assert.NotNull(registeredA);
            Assert.Equal(Lifetime.Singleton, registeredA.Lifetime);
            Assert.True(registeredA.RegistrationOwnsInstance);
            Assert.Equal(typeof(AnimalService), registeredA.ImplementationType);

            var registeredB = namedRegistrations["B"];

            Assert.NotNull(registeredB);
            Assert.Equal(Lifetime.Singleton, registeredB.Lifetime);
            Assert.True(registeredB.RegistrationOwnsInstance);
            Assert.Equal(typeof(BearService), registeredB.ImplementationType);
        }
예제 #5
0
        public static IServiceCollection AddNamed <TService>(this IServiceCollection services, Action <NamedServiceRegistry <TService> > configure)
        {
            services.AddSingleton <NamedServiceRegistry <TService> >(sp =>
            {
                var registry = new NamedServiceRegistry <TService>(sp);
                configure(registry);
                return(registry);
            });

            services.AddScoped <NamedServiceResolver <TService> >();

            var serviceType = typeof(TService);

            services.AddScoped <Func <string, TService> >(sp => new Func <string, TService>(name =>
            {
                var resolver = sp.GetRequiredService <NamedServiceResolver <TService> >();
                return(resolver.Get(name));
            }));

            return(services);
        }
        public void Can_Add_Singleton_Instance_Registrations()
        {
            var namedRegistrations = new NamedServiceRegistry<AnimalService>(GetDefaultServiceProvider());
            namedRegistrations.AddSingleton("A", new AnimalService() { SomeProperty = "A" });
            namedRegistrations.AddSingleton("B", new AnimalService() { SomeProperty = "B" });
            namedRegistrations.AddSingleton("C", new BearService() { SomeProperty = "C" });
            namedRegistrations.AddSingleton("D", new LionService() { SomeProperty = "D", SomeOtherProperty = true });
            namedRegistrations.AddSingleton("E", new LionService() { SomeProperty = "E" }, registrationOwnsInstance: true);

            var registeredA = namedRegistrations["A"];
            var registeredB = namedRegistrations["B"];

            Assert.NotNull(registeredA);
            Assert.Equal(Lifetime.Singleton, registeredA.Lifetime);
            Assert.False(registeredA.RegistrationOwnsInstance);
            Assert.Null(registeredA.ImplementationType);

            Assert.NotNull(registeredB);
            Assert.Equal(Lifetime.Singleton, registeredB.Lifetime);
            Assert.False(registeredB.RegistrationOwnsInstance);
            Assert.Null(registeredB.ImplementationType);

            var registeredC = namedRegistrations["C"];
            var registeredD = namedRegistrations["D"];

            Assert.NotNull(registeredC);
            Assert.Equal(Lifetime.Singleton, registeredC.Lifetime);
            Assert.False(registeredC.RegistrationOwnsInstance);
            Assert.Null(registeredC.ImplementationType);

            Assert.NotNull(registeredD);
            Assert.Equal(Lifetime.Singleton, registeredD.Lifetime);
            Assert.False(registeredD.RegistrationOwnsInstance);
            Assert.Null(registeredD.ImplementationType);

            var registeredE = namedRegistrations["E"];
            Assert.True(registeredE.RegistrationOwnsInstance);

        }
예제 #7
0
 public NamedServiceResolver(NamedServiceRegistry <TService> registry, IServiceProvider serviceProvider)
 {
     Registry             = registry;
     _serviceProvider     = serviceProvider;
     _scopedInstanceCache = new Lazy <ScopedInstanceCache <TService> >();
 }