ninject /src/Ninject.Tests/Integration/TransientScopeTests.cs

Language C# Lines 152
MD5 Hash e11e487e616c3e4b67f308e75b056691
Repository https://github.com/developingchris/ninject.git View Raw File View Project SPDX
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using Ninject.Activation;
using Ninject.Activation.Caching;
using Ninject.Tests.Fakes;
using Xunit;
using Xunit.Should;

namespace Ninject.Tests.Integration.TransientScopeTests
{
	public class TransientScopeContext
	{
		protected readonly StandardKernel kernel;

		public TransientScopeContext()
		{
			kernel = new StandardKernel();
		}
	}

	public class WhenServiceIsBoundToInterfaceInTransientScope : TransientScopeContext
	{
		[Fact]
		public void NewInstanceIsReturnedForEachRequest()
		{
			kernel.Bind<IWeapon>().To<Sword>().InTransientScope();

			var instance1 = kernel.Get<IWeapon>();
			var instance2 = kernel.Get<IWeapon>();

			instance1.ShouldNotBeSameAs(instance2);
		}

		[Fact]
		public void InstancesAreGarbageCollectedIfAllExternalReferencesAreDropped()
		{
			kernel.Bind<IWeapon>().To<Sword>().InTransientScope();

			var instance = kernel.Get<IWeapon>();
			var reference = new WeakReference(instance);

			instance = null;

			GC.Collect();
			GC.WaitForPendingFinalizers();

			reference.IsAlive.ShouldBeFalse();
		}
	}

	public class WhenServiceIsBoundToSelfInTransientScope : TransientScopeContext
	{
		[Fact]
		public void NewInstanceIsReturnedForEachRequest()
		{
			kernel.Bind<Sword>().ToSelf().InTransientScope();

			var sword1 = kernel.Get<Sword>();
			var sword2 = kernel.Get<Sword>();

			sword1.ShouldNotBeSameAs(sword2);
		}

		[Fact]
		public void InstancesAreGarbageCollectedIfAllExternalReferencesAreDropped()
		{
			kernel.Bind<Sword>().ToSelf().InTransientScope();

			var instance = kernel.Get<Sword>();
			var reference = new WeakReference(instance);

			instance = null;

			GC.Collect();
			GC.WaitForPendingFinalizers();

			reference.IsAlive.ShouldBeFalse();

			var cache = kernel.Components.Get<ICache>();
			cache.Prune();

			cache.Count.ShouldBe(0);
		}
	}

	public class WhenServiceIsBoundToProviderInTransientScope : TransientScopeContext
	{
		[Fact]
		public void NewInstanceIsReturnedForEachRequest()
		{
			kernel.Bind<IWeapon>().ToProvider<SwordProvider>().InTransientScope();

			var instance1 = kernel.Get<IWeapon>();
			var instance2 = kernel.Get<IWeapon>();

			instance1.ShouldNotBeSameAs(instance2);
		}

		[Fact]
		public void InstancesAreGarbageCollectedIfAllExternalReferencesAreDropped()
		{
			kernel.Bind<IWeapon>().ToProvider<SwordProvider>().InTransientScope();

			var instance = kernel.Get<IWeapon>();
			var reference = new WeakReference(instance);

			instance = null;

			GC.Collect();
			GC.WaitForPendingFinalizers();

			reference.IsAlive.ShouldBeFalse();
		}
	}

	public class WhenServiceIsBoundToMethodInTransientScope : TransientScopeContext
	{
		[Fact]
		public void NewInstanceIsReturnedForEachRequest()
		{
			kernel.Bind<IWeapon>().ToMethod(x => new Sword()).InTransientScope();

			var instance1 = kernel.Get<IWeapon>();
			var instance2 = kernel.Get<IWeapon>();

			instance1.ShouldNotBeSameAs(instance2);
		}

		[Fact]
		public void InstancesAreGarbageCollectedIfAllExternalReferencesAreDropped()
		{
			kernel.Bind<IWeapon>().ToMethod(x => new Sword()).InTransientScope();

			var instance = kernel.Get<IWeapon>();
			var reference = new WeakReference(instance);

			instance = null;

			GC.Collect();
			GC.WaitForPendingFinalizers();

			reference.IsAlive.ShouldBeFalse();
		}
	}

	public class SwordProvider : Provider<Sword>
	{
		protected override Sword CreateInstance(IContext context)
		{
			return new Sword();
		}
	}
}
Back to Top