コード例 #1
0
        public void MultiThreadedCacheReadShouldYieldConsistentResults()
        {
            var decorator  = new RepositoryDecorator();
            var repository = decorator.Decorate <ITestRepository>(new TestRepository());

            var taskList   = new List <Task>();
            var resultList = new List <Person>();

            for (int i = 0; i < 1000; i++)
            {
                taskList.Add(Task.Run(async() =>
                {
                    //Debug.WriteLine(Task.CurrentId);
                    var people = (await repository.RetrievePersonsAsync());
                    resultList.Add(people.Single());
                    await Task.Delay(TimeSpan.FromSeconds(1));
                }));
            }

            Task.WaitAll(taskList.ToArray());

            Debug.WriteLine("{0} items in the result list", taskList.Count);

            Assert.AreEqual(resultList.Count, 1000);
        }
コード例 #2
0
        public InvalidationConventionsFluentInterface(RepositoryDecorator repositoryDecorator)
        {
            var defaultCacheItemPolicy = new CacheItemPolicy();

            defaultCacheItemPolicy.SlidingExpiration = TimeSpan.FromMinutes(10);

            _repositoryDecorator = repositoryDecorator;
            _repositoryDecorator.CacheProvider.InvalidationConfiguration = new InvalidationConfiguration(defaultCacheItemPolicy);
        }
コード例 #3
0
        public void RepositoryMethodShouldBeIntercepted()
        {
            var decorator = new RepositoryDecorator(new FakeCacheInterceptor());

            var repo     = new TestRepository();
            var decoRepo = decorator.Decorate <ITestRepository>(repo);
            var x        = decoRepo.RetrievePersons();

            Assert.IsTrue(true);
        }
コード例 #4
0
        public void DefaultConventionsShouldAllowCache()
        {
            var decorator = new RepositoryDecorator();

            var repo     = new TestRepository();
            var decoRepo = decorator.Decorate <ITestRepository>(repo);

            var personsA = decoRepo.RetrievePersons();
            var personsB = decoRepo.RetrievePersons();

            Assert.AreEqual(personsA, personsB);
        }
コード例 #5
0
        public async Task NewFactoryShouldBeCreated()
        {
            var decorator = new RepositoryDecorator();

            var repo     = new TestRepository();
            var decoRepo = decorator.Decorate <ITestRepository>(repo);

            var persons = await decoRepo.RetrievePersonsAsync();

            Assert.IsNotNull(persons);
            Assert.AreSame(persons.First().First, "Dries");
        }
コード例 #6
0
        public void NoCacheAttributeShouldIgnoreCacher()
        {
            var decorator = new RepositoryDecorator();

            var repo     = new TestRepository();
            var decoRepo = decorator.Decorate <ITestRepository>(repo);

            var persons = decoRepo.RetrievePersonsNoCache();

            Assert.IsNotNull(persons);
            Assert.AreSame(persons.First().First, "Dries");
        }
コード例 #7
0
        public void AbsoluteExpirationNotExpiredShouldBeEqual()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.CacheItemPolicyAbsolute(new DateTimeOffset(DateTime.Now.AddSeconds(1)));

            var decoRepo = decorator.Decorate <ITestRepository>(new TestRepository());

            var personsA = decoRepo.RetrievePersons();
            var personsB = decoRepo.RetrievePersons();

            Assert.AreEqual(personsA, personsB);
        }
コード例 #8
0
        public void ExtraConventionsShouldAllowCache()
        {
            var decorator = new RepositoryDecorator();

            decorator.CacheIf.AddCondition(new TestConvention());

            var repo     = new TestRepository();
            var decoRepo = decorator.Decorate <ITestRepository>(repo);

            var personsA = decoRepo.SelectPersons();
            var personsB = decoRepo.SelectPersons();

            Assert.AreEqual(personsA, personsB);
        }
コード例 #9
0
        public void RepositoriesDecoratedBySameDecoratorShouldHaveSharedCache()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.CacheItemPolicySliding(TimeSpan.FromMinutes(5));

            var repoA = decorator.Decorate <ITestRepository>(new TestRepository());
            var repoB = decorator.Decorate <ITestRepository>(new TestRepository());

            var repoAResults = repoA.RetrievePersons();
            var repoBResults = repoB.RetrievePersons();

            Assert.AreSame(repoAResults.First(), repoBResults.First());
        }
コード例 #10
0
        public void ChangeCacheItemPolicyShouldNotThrowException()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.CacheItemPolicySliding(TimeSpan.FromSeconds(1));

            var decoRepo = decorator.Decorate <ITestRepository>(new TestRepository());

            var personsA = decoRepo.RetrievePersons();

            Thread.Sleep(1000);
            var personsB = decoRepo.RetrievePersons();

            Assert.AreNotEqual(personsA, personsB);
        }
コード例 #11
0
        public void MethodInvocationShouldInvalidateEvenWhenCacheItemPolicyIsntTriggered()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.CacheItemPolicySliding(TimeSpan.FromSeconds(5)).MethodInvocation(new DefaultMethodInvalidationConvention());

            var decoRepo = decorator.Decorate <ITestRepository>(new TestRepository());

            var personsA = decoRepo.RetrievePersons();

            decoRepo.UpdatePerson(personsA.First());
            var personsB = decoRepo.RetrievePersons();

            Assert.AreNotEqual(personsA, personsB);
        }
コード例 #12
0
        public void MultiThreadedCacheWriteShouldNotFail()
        {
            var decorator  = new RepositoryDecorator();
            var repository = decorator.Decorate <ITestRepository>(new TestRepository());

            var taskList   = new List <Task>();
            var resultList = new List <Person>();

            for (int i = 0; i < 1000; i++)
            {
                taskList.Add(Task.Run(() =>
                {
                    resultList.Add(repository.RetrievePerson(i));
                }));
            }
        }
コード例 #13
0
        public void ShouldInvalidateOnDefaultMethodInvalidationConvention()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.MethodInvocation(new DefaultMethodInvalidationConvention());

            var repo     = new TestRepository();
            var decoRepo = decorator.Decorate <ITestRepository>(repo);


            var personsA = decoRepo.RetrievePersons();
            var personsB = decoRepo.RetrievePersons();

            Assert.AreEqual(personsA, personsB);

            var person = personsA.FirstOrDefault();

            decoRepo.UpdatePerson(person);
        }
コード例 #14
0
        public void SlidingCachePolicyIsActuallySliding()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.CacheItemPolicySliding(TimeSpan.FromSeconds(1));

            var decoRepo = decorator.Decorate <ITestRepository>(new TestRepository());

            var personsA = decoRepo.RetrievePersons();

            Thread.Sleep(500);
            var personsB = decoRepo.RetrievePersons();

            Assert.AreEqual(personsA, personsB);

            Thread.Sleep(1000);
            personsB = decoRepo.RetrievePersons();

            Assert.AreNotEqual(personsA, personsB);
        }
 public CachingConventionsFluentInterface(RepositoryDecorator repositoryDecorator)
 {
     _repositoryDecorator = repositoryDecorator;
     AddCondition(new DefaultCachingConvention());
 }
コード例 #16
0
        public void InvalidationConventionShouldBeAbleToBeConfigured()
        {
            var decorator = new RepositoryDecorator();

            decorator.InvalidateOn.MethodInvocation(new DefaultMethodInvalidationConvention());
        }
コード例 #17
0
        public void DoubleConventionRegistrationShouldThrowException()
        {
            var decorator = new RepositoryDecorator();

            decorator.CacheIf.AddCondition(new DefaultCachingConvention());
        }