Ejemplo n.º 1
0
        public void Transient()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <ISingleService, SingleService>();

            IContainerScope scope = services.CreateScope();

            ISingleService single = services.Get <ISingleService>(scope);

            single.Foo = "single";

            ISingleService s1 = services.Get <ISingleService>(scope);

            Assert.NotEqual(single.Foo, s1.Foo);

            ISingleService s2 = services.Get <ISingleService>();

            Assert.NotEqual(single.Foo, s2.Foo);

            IContainerScope scope2 = services.CreateScope();
            ISingleService  s3     = services.Get <ISingleService>(scope2);

            Assert.NotEqual(single.Foo, s3.Foo);
        }
Ejemplo n.º 2
0
        public void WaitLimitAndTimeout()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <ISingleService, SingleService>(o =>
            {
                o.PoolMaxSize = 10;
                o.ExceedLimitWhenWaitTimeout = false;
                o.WaitAvailableDuration      = TimeSpan.FromMilliseconds(1500);
            });

            IContainerScope scope = services.CreateScope();

            for (int i = 0; i < 10; i++)
            {
                ISingleService service = services.Get <ISingleService>(scope);
                Assert.NotNull(service);
            }

            DateTime start = DateTime.UtcNow;

            Assert.Throws <NullReferenceException>(() => services.Get <ISingleService>(scope));
            DateTime end = DateTime.UtcNow;

            Assert.True(end - start > TimeSpan.FromMilliseconds(1490));
        }
Ejemplo n.º 3
0
        public async Task ScopedInTransientPool()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <IParentService, ParentService>();
            services.AddScoped <IFirstChildService, FirstChildService>();
            services.AddScoped <ISecondChildService, SecondChildService>();

            IContainerScope scope  = services.CreateScope();
            IParentService  parent = await services.Get <IParentService>(scope);

            parent.Foo        = "parent";
            parent.First.Foo  = "first";
            parent.Second.Foo = "second";

            IParentService p = await services.Get <IParentService>(scope);

            Assert.NotEqual(parent.Foo, p.Foo);
            Assert.Equal(parent.First.Foo, p.First.Foo);
            Assert.Equal(parent.Second.Foo, p.Second.Foo);

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await services.Get <IFirstChildService>());

            IFirstChildService f2 = await services.Get <IFirstChildService>(scope);

            Assert.Equal(parent.First.Foo, f2.Foo);

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await services.Get <ISecondChildService>());

            ISecondChildService s2 = await services.Get <ISecondChildService>(scope);

            Assert.Equal(parent.Second.Foo, s2.Foo);
        }
Ejemplo n.º 4
0
        public void TransientInTransientPool()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <IParentService, ParentService>();
            services.AddTransient <IFirstChildService, FirstChildService>();
            services.AddTransient <ISecondChildService, SecondChildService>();

            IContainerScope scope  = services.CreateScope();
            IParentService  parent = services.Get <IParentService>(scope);

            parent.Foo        = "parent";
            parent.First.Foo  = "first";
            parent.Second.Foo = "second";

            IParentService p = services.Get <IParentService>(scope);

            Assert.NotEqual(parent.Foo, p.Foo);
            Assert.NotEqual(parent.First.Foo, p.First.Foo);
            Assert.NotEqual(parent.Second.Foo, p.Second.Foo);

            IFirstChildService f1 = services.Get <IFirstChildService>();
            IFirstChildService f2 = services.Get <IFirstChildService>(scope);

            Assert.NotEqual(parent.First.Foo, f1.Foo);
            Assert.NotEqual(parent.First.Foo, f2.Foo);

            ISecondChildService s1 = services.Get <ISecondChildService>();
            ISecondChildService s2 = services.Get <ISecondChildService>(scope);

            Assert.NotEqual(parent.Second.Foo, s1.Foo);
            Assert.NotEqual(parent.Second.Foo, s2.Foo);
        }
Ejemplo n.º 5
0
        public void PoolsInTransientPool()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <IParentService, ParentService>();
            services.AddTransientPool <IFirstChildService, FirstChildService>();
            services.AddScopedPool <ISecondChildService, SecondChildService>();

            IContainerScope scope = services.CreateScope();

            Assert.Throws <ScopeException>(() => services.Get <IParentService>());
            Assert.Throws <ScopeException>(() => services.Get <ISecondChildService>());

            IParentService parent = services.Get <IParentService>(scope);

            parent.Foo        = "parent";
            parent.First.Foo  = "first";
            parent.Second.Foo = "second";

            IParentService p1 = services.Get <IParentService>(scope);

            Assert.NotEqual(parent.Foo, p1.Foo);
            Assert.NotEqual(parent.First.Foo, p1.First.Foo);
            Assert.Equal(parent.Second.Foo, p1.Second.Foo);

            IFirstChildService first = services.Get <IFirstChildService>(scope);
            IFirstChildService f2    = services.Get <IFirstChildService>();

            Assert.NotEqual(parent.First.Foo, first.Foo);
            Assert.NotEqual(parent.First.Foo, f2.Foo);

            ISecondChildService second = services.Get <ISecondChildService>(scope);

            Assert.Equal(parent.Second.Foo, second.Foo);

            IContainerScope scope2 = services.CreateScope();
            IParentService  p2     = services.Get <IParentService>(scope2);

            Assert.NotEqual(parent.Foo, p2.Foo);
            Assert.NotEqual(parent.First.Foo, p2.First.Foo);
            Assert.NotEqual(parent.Second.Foo, p2.Second.Foo);
        }
Ejemplo n.º 6
0
        public async Task PoolsInSingleton()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddSingleton <IParentService, ParentService>();
            services.AddTransientPool <IFirstChildService, FirstChildService>();
            services.AddScopedPool <ISecondChildService, SecondChildService>();

            IContainerScope scope = services.CreateScope();

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await services.Get <IParentService>());

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await services.Get <ISecondChildService>());

            IParentService parent = await services.Get <IParentService>(scope);

            parent.Foo        = "parent";
            parent.First.Foo  = "first";
            parent.Second.Foo = "second";

            //getting same parent instance (cuz of singleton) so, transients in the same parent instances should be same
            IParentService p1 = await services.Get <IParentService>(scope);

            Assert.Equal(parent.Foo, p1.Foo);
            Assert.Equal(parent.First.Foo, p1.First.Foo);
            Assert.Equal(parent.Second.Foo, p1.Second.Foo);

            IFirstChildService first = await services.Get <IFirstChildService>(scope);

            IFirstChildService f2 = await services.Get <IFirstChildService>();

            Assert.NotEqual(parent.First.Foo, first.Foo);
            Assert.NotEqual(parent.First.Foo, f2.Foo);

            ISecondChildService second = await services.Get <ISecondChildService>(scope);

            Assert.Equal(parent.Second.Foo, second.Foo);

            //children in same singleton instance are same
            IContainerScope scope2 = services.CreateScope();
            IParentService  p2     = await services.Get <IParentService>(scope2);

            Assert.Equal(parent.Foo, p2.Foo);
            Assert.Equal(parent.First.Foo, p2.First.Foo);
            Assert.Equal(parent.Second.Foo, p2.Second.Foo);
        }
Ejemplo n.º 7
0
        public void PoolsInScoped()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddScoped <IParentService, ParentService>();
            services.AddTransientPool <IFirstChildService, FirstChildService>();
            services.AddScopedPool <ISecondChildService, SecondChildService>();

            IContainerScope scope = services.CreateScope();

            Assert.Throws <ScopeException>(() => services.Get <IParentService>());
            Assert.Throws <ScopeException>(() => services.Get <ISecondChildService>());

            IParentService parent = services.Get <IParentService>(scope);

            parent.Foo        = "parent";
            parent.First.Foo  = "first";
            parent.Second.Foo = "second";

            //getting same parent instance (cuz of scoped) so, transients in the same parent instances should be same
            IParentService p1 = services.Get <IParentService>(scope);

            Assert.Equal(parent.Foo, p1.Foo);
            Assert.Equal(parent.First.Foo, p1.First.Foo);
            Assert.Equal(parent.Second.Foo, p1.Second.Foo);

            IFirstChildService first = services.Get <IFirstChildService>(scope);
            IFirstChildService f2    = services.Get <IFirstChildService>();

            Assert.NotEqual(parent.First.Foo, first.Foo);
            Assert.NotEqual(parent.First.Foo, f2.Foo);

            ISecondChildService second = services.Get <ISecondChildService>(scope);

            Assert.Equal(parent.Second.Foo, second.Foo);

            IContainerScope scope2 = services.CreateScope();
            IParentService  p2     = services.Get <IParentService>(scope2);

            Assert.NotEqual(parent.Foo, p2.Foo);
            Assert.NotEqual(parent.First.Foo, p2.First.Foo);
            Assert.NotEqual(parent.Second.Foo, p2.Second.Foo);
        }
Ejemplo n.º 8
0
        public async Task SingletonInTransientPool()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <IParentService, ParentService>();
            services.AddSingleton <IFirstChildService, FirstChildService>();
            services.AddSingleton <ISecondChildService, SecondChildService>();

            IContainerScope scope  = services.CreateScope();
            IParentService  parent = await services.Get <IParentService>(scope);

            parent.Foo        = "parent";
            parent.First.Foo  = "first";
            parent.Second.Foo = "second";

            IParentService p = await services.Get <IParentService>(scope);

            Assert.NotEqual(parent.Foo, p.Foo);
            Assert.Equal(parent.First.Foo, p.First.Foo);
            Assert.Equal(parent.Second.Foo, p.Second.Foo);

            IFirstChildService f2 = await services.Get <IFirstChildService>(scope);

            IFirstChildService f3 = await services.Get <IFirstChildService>();

            Assert.Equal(parent.First.Foo, f2.Foo);
            Assert.Equal(parent.First.Foo, f3.Foo);

            ISecondChildService s2 = await services.Get <ISecondChildService>(scope);

            ISecondChildService s3 = await services.Get <ISecondChildService>();

            Assert.Equal(parent.Second.Foo, s2.Foo);
            Assert.Equal(parent.Second.Foo, s3.Foo);

            IParentService p2 = await services.Get <IParentService>();

            Assert.NotEqual(parent.Foo, p2.Foo);
            Assert.Equal(parent.First.Foo, p2.First.Foo);
            Assert.Equal(parent.Second.Foo, p2.Second.Foo);
        }
Ejemplo n.º 9
0
        public async Task WaitLimitAndGet()
        {
            ServiceContainer services = new ServiceContainer();

            services.AddTransientPool <ISingleService, SingleService>(o =>
            {
                o.PoolMaxSize = 10;
                o.ExceedLimitWhenWaitTimeout = false;
                o.WaitAvailableDuration      = TimeSpan.FromMilliseconds(5000);
            });

            IContainerScope scope = services.CreateScope();

            for (int i = 0; i < 10; i++)
            {
                ISingleService service = await services.Get <ISingleService>(scope);

                Assert.NotNull(service);
            }

            DateTime start = DateTime.UtcNow;
            Thread   th    = new Thread(() =>
            {
                Thread.Sleep(500);
                scope.Dispose();
            });

            th.Start();

            IContainerScope scope2 = services.CreateScope();
            ISingleService  s      = await services.Get <ISingleService>(scope2);

            Assert.NotNull(s);

            DateTime end  = DateTime.UtcNow;
            TimeSpan time = end - start;

            Assert.True(time > TimeSpan.FromMilliseconds(490));
            Assert.True(time < TimeSpan.FromMilliseconds(750));
        }