예제 #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ProxyFactory"/> class.
        /// </summary>
        /// <param name="strongNamedAssembly"></param>
        /// <param name="canSaveAssembly"></param>
        /// <param name="interceptionFilter">The interception filter.</param>
        public ProxyFactory(bool strongNamedAssembly = false,bool canSaveAssembly = false, IInterceptionFilter interceptionFilter = null)
        {
            _typeBuilderFactory = new ProxyTypeBuilderFactory(strongNamedAssembly, canSaveAssembly);

            if (interceptionFilter == null)
                interceptionFilter = new NonInterceptedInterceptionFilter();

            _interceptionFilter = interceptionFilter;

            _proxyTemplateCache = new LockOnWriteCache<IProxyDefinition, IProxyTemplate>();
        }
예제 #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ProxyFactory"/> class.
        /// </summary>
        /// <param name="strongNamedAssembly"></param>
        /// <param name="canSaveAssembly"></param>
        /// <param name="interceptionFilter">The interception filter.</param>
        public ProxyFactory(bool strongNamedAssembly = false, bool canSaveAssembly = false, IInterceptionFilter interceptionFilter = null)
        {
            _typeBuilderFactory = new ProxyTypeBuilderFactory(strongNamedAssembly, canSaveAssembly);

            if (interceptionFilter == null)
            {
                interceptionFilter = new NonInterceptedInterceptionFilter();
            }

            _interceptionFilter = interceptionFilter;

            _proxyTemplateCache = new LockOnWriteCache <IProxyDefinition, IProxyTemplate>();
        }
예제 #3
0
        public void GetOrAddWithoutCacheHitTest()
        {
            // Arrange
            var invocationCount             = 0;
            Func <int, string> valueFactory = k =>
            {
                invocationCount++;
                return(Convert.ToString(k));
            };
            var cache = new LockOnWriteCache <int, string>();

            // Act
            var value = cache.GetOrAdd(1, valueFactory);

            // Assert
            Assert.That(value, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
        public void GetOrAddWithCacheHitTest()
        {
            // Arrange
            // Arrange
            var invocationCount = 0;
            Func<int, string> valueFactory = k =>
                {
                    invocationCount++;
                    return Convert.ToString(k);
                };
            var cache = new LockOnWriteCache<int, string>();

            // Act
            cache.GetOrAdd(1, valueFactory);

            var value = cache.GetOrAdd(1, valueFactory);

            // Assert
            Assert.That(value, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
        public void GetOrAddWithoutCacheHitAndConcurrencyTest()
        {
            // Arrange
            var monitor = new Object();
            var invocationCount = 0;
            Func<int, string> valueFactory = k =>
                {
                    lock (monitor)
                    {
                        Monitor.Wait(monitor);
                    }

                    invocationCount++;
                    return Convert.ToString(k);
                };
            var cache = new LockOnWriteCache<int, string>();

            // Act
            var firstTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));
            var secondTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));

            firstTask.Wait(500);
            secondTask.Wait(500);

            Assert.That(firstTask.IsCompleted, Is.False);
            Assert.That(secondTask.IsCompleted, Is.False);

            lock (monitor)
            {
                Monitor.Pulse(monitor);
            }

            Task.WaitAll(firstTask, secondTask);

            // Assert
            Assert.That(firstTask.Result, Is.EqualTo("1"));
            Assert.That(secondTask.Result, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }
예제 #6
0
        public void GetOrAddWithoutCacheHitAndConcurrencyTest()
        {
            // Arrange
            var monitor                     = new Object();
            var invocationCount             = 0;
            Func <int, string> valueFactory = k =>
            {
                lock (monitor)
                {
                    Monitor.Wait(monitor);
                }

                invocationCount++;
                return(Convert.ToString(k));
            };
            var cache = new LockOnWriteCache <int, string>();

            // Act
            var firstTask  = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));
            var secondTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory));

            firstTask.Wait(500);
            secondTask.Wait(500);

            Assert.That(firstTask.IsCompleted, Is.False);
            Assert.That(secondTask.IsCompleted, Is.False);

            lock (monitor)
            {
                Monitor.Pulse(monitor);
            }

            Task.WaitAll(firstTask, secondTask);

            // Assert
            Assert.That(firstTask.Result, Is.EqualTo("1"));
            Assert.That(secondTask.Result, Is.EqualTo("1"));
            Assert.That(invocationCount, Is.EqualTo(1));
        }