• Avalanche.Core
Search Results for

    Show / Hide Table of Contents
    • Avalanche.Accessor
      • Introduction
      • IAccessor
        • IAccessor
        • IListAccessor
        • IMapAccessor
        • IRecordAccessor
        • IContentAccessor
        • IOneOfAccessor
        • IAnyAccessor
      • .Net
        • Introduction
        • IList<T>
        • IDictionary<K,V>
        • FieldInfo
        • OneOfAttribute
        • StructLayoutAttribute
        • Class
      • Protobuf
        • Introduction
      • Articles
        • Dependency Injection
        • AccessorMessages
    • Avalanche.Binding
      • Introduction
    • Avalanche.Core
      • License
    • Avalanche.DataType
      • Introduction
      • DataType
        • IDataType
        • IListType
        • IMapType
        • IRecordType
        • IFieldType
        • IOneOfType
        • IAnyType
        • IStringType
        • IValueType
        • IIntegerType
        • IEnumerationType
        • IRealType
      • .Net
        • Introduction
        • IList<T>
        • IDictionary<K,V>
        • FieldInfo
        • Enum
        • OneOfAttribute
        • StructLayoutAttribute
        • Class
      • Protobuf
        • Introduction
      • Articles
        • DataTypeRequest
        • PrintTree
        • DataTypeMessages
    • Avalanche.Emit
      • Introduction
      • TypeBuilder
      • ConstructorBuilder
      • MethodBuilder
      • PropertyBuilder
      • FieldBuilder
      • Emit
      • Utilities
    • Avalanche.FileSystem
      • Introduction
      • Abstractions
        • IFileSystem
          • IFileSystemBrowse
          • IFileSystemCreateDirectory
          • IFileSystemDelete
          • IFileSystemFileAttribute
          • IFileSystemMount
          • IFileSystemMove
          • IFileSystemObserve
          • IFileSystemOpen
        • IEvent
        • IEntry
        • IOption
        • IToken
      • FileSystem
      • VirtualFileSystem
      • MemoryFileSystem
      • EmbeddedFileSystem
      • HttpFileSystem
      • Decoration
      • IFileProvider
      • Events
      • Utilities
        • Dispose
        • File Scanner
        • Visit Tree
        • File Operation
    • Avalanche.Identity
      • Introduction
      • Identity
      • IdentityParts
      • IdentityInterner
      • IdentityComparer
      • Print Tree
      • IdentityAccessors
        • Introduction
        • TypeName
    • Avalanche.Localization
      • Introduction
      • Localization
      • LocalizationFile
      • LocalizationFiles
      • LocalizationFileSystem
      • LocalizationFileFormat
      • LocalizationLine
      • LocalizationLines
      • TemplateFormat
      • CultureProvider
      • FallbackCultureProvider
      • ResourceManager
      • LocalizationError
      • Microsoft.Extensions
        • Introduction
        • DependencyInjection
        • FileProvider
        • Logging
        • ITextLocalizer
        • IFileLocalizer
        • Localization
      • Asp.Net
        • Introduction
        • Supplying localization
        • Inject to pages
        • Culture Assigned
        • Minimalistic Api
        • Diagnostics
      • Pluralization
        • Introduction
        • Multiple plural parameters
        • Custom PluralRules
        • Invariant Culture
        • Unit Prefix
        • IPluralRule
        • IPluralNumber
        • IPluralRules
        • CLDRs
        • Unicode.CLDR40
        • Unicode.CLDR41
        • Unicode.CLDR42
      • Articles
        • Alphabet localization
        • Benchmarks
        • Caching
        • Class Library
        • Demo
        • Diagnostics
        • Embedded resources
        • Emplacement
        • File localization
        • Text localization
        • Printing templates
    • Avalanche.Message
      • Introduction
      • IMessage
      • IMessageProvider
      • IMessageDescription
      • IMessageDescriptions
      • MessageLevel
      • Message printing
      • Messages and Exceptions
      • Microsoft.Extensions
        • DependencyInjection
      • Articles
        • Aggregate Messages
        • Localization
        • Logging
        • Validation
    • Avalanche.Service
      • Introduction
      • Service
        • Introduction
        • IService
        • IServiceDisposable
        • IServiceDecoration
        • IServiceCast
        • IServiceObservable
        • IServiceContainer
        • Construction
        • Query
        • CancellationToken
        • CachePolicy
        • Scope
      • Handler
        • Introduction
        • IHandler
        • IHandlerCast
        • IHandlerDecoration
        • IHandlerWithOrder
        • CancellationToken
        • Cyclicity
        • Delegates
        • Invokable
        • ExportAttribute
        • OrderAttribute
        • PrintTree
        • Recursion
      • Query
        • Introduction
        • IQuery
        • IQueryCast
        • IQueryDecoration
      • Entry
        • Introduction
        • IEntry
        • IEntryCast
        • IEntryDecoration
        • IEntryObservable
        • IEntryVisitable
        • EntryState
      • Request
        • Introduction
        • IRequest
        • IRequestFor
        • IRequestToBeCached
        • IRequestToBeDisposed
        • RequestAttribute
        • ContextParameterAttribute
        • Print Tree
      • Dependency Injection
        • Introduction
        • Asp.Net
        • ServiceRequest<T>
        • Decorating a service
        • Handler
        • CachePolicy
        • CancellationToken
        • QueryLogger
      • Examples
        • NodeCount
        • Expression
        • Mapper
      • Articles
        • Benchmarks
        • Error Handling
        • ServiceMessages
    • Avalanche.StatusCode
      • Introduction
      • HResult
        • Introduction
        • HResult.Facilities
        • BasicMessages
        • RpcMessages
        • DispatchMessages
        • ItfMessages
        • Win32Messages
        • ClrMessages
      • System
        • Introduction
        • AccessControlMessages
        • AggregateMessages
        • AppDomainMessages
        • ArgumentMessages
        • ArgumentNullMessages
        • ArgumentOutOfRangeMessages
        • ArithmeticMessages
        • ArrayMessages
        • AssemblyMessages
        • BadImageFormatMessages
        • CodeContractMessages
        • CodePageMessages
        • CollectionsMessages
        • CompilerServiceMessages
        • CryptographyMessages
        • CultureMessages
        • DiagnosticsMessages
        • EventSourceMessages
        • ExecutionEngineMessages
        • FormatMessages
        • HostProtectionMessages
        • IOMessages
        • IndexOutOfRangeMessages
        • InteropServiceMessages
        • InvalidCastMessages
        • InvalidOperationMessages
        • IsolatedStorageMessages
        • LazyMessages
        • MarshalerMessages
        • MemoryMessages
        • MiscellaneousMessages
        • NotImplementedMessages
        • NotSupportedMessages
        • ObjectDisposedMessages
        • OperationCanceledMessages
        • OverflowMessages
        • PlatformMessages
        • PolicyMessages
        • PrincipalMessages
        • ProgramMessages
        • ReferenceMessages
        • ReflectionMessages
        • RegionMessages
        • RemotingMessages
        • ResourcesMessages
        • SecurityMessages
        • SerializationMessages
        • StackMessages
        • TaskMessages
        • TextMessages
        • ThreadingMessages
        • TimeZoneMessages
        • TypeMessages
        • XmlMessages
      • HttpStatusCode
      • OpcUaStatusCode
    • Avalanche.Template
      • Introduction
      • TemplateFormats
      • ITemplatePrintable
      • ITemplateFormatPrintable
      • ITemplateText
      • ITemplateBreakdown
      • ITemplateFormat
      • ITemplateFormats
      • Extract Arguments
      • Emplacement
    • Avalanche.Tokenizer
      • Introduction
      • IToken
      • ITokenizer
      • Tokenizers
    • Avalanche.Utilities
      • Introduction
      • Collections
        • Tuples
        • StructList
        • ArrayList
        • BijectionMap
        • LocakableDictionary
        • LockableList
        • MapList
        • Pipe
        • RingQueue
        • EnumerableExtensions
        • TupleUtilities
        • ArrayUtilities
      • Comparers
        • IGraphComparer
        • IGraphComparable
        • AlphaNumericComparer
        • EnumerableComparer
        • EnumerableGraphComparer
        • ReferenceComparer
        • KeyValuePairComparer
        • DefaultComparerProvider
        • RecordComparer
      • Cloners
        • ICloner
        • IGraphCloner
        • IGraphCloneable
        • ListCloner
        • DictionaryCloner
        • FieldCloner
        • PassthroughCloner
        • RecordCloner
        • ClonerProvider
      • Dispose
        • IDisposeAttachable
        • IDisposeBelatable
      • Provider
        • Introduction
        • ProviderBase
        • Delegate
        • Pipe
        • Cache
        • ResultCapture
        • AsReadOnly
        • AsService
        • IProviderEvent
      • Record
        • IRecordDescription
        • IFieldDescription
        • IConstructorDescription
        • IConstructionDescription
        • IParameterDescription
        • IRecordProviders
        • RecordDelegates
          • RecordCreate
          • RecordClone
          • RecordCopy
          • IRecordDelegates
        • FieldDelegates
          • FieldRead
          • FieldWrite
          • RecreateWith
          • IFieldDelegates
      • String
        • IEscaper
        • UnicodeString
      • Miscellaneous
        • IIdGenerator
        • Permutation
        • IReadOnly
        • IUserDataContainer
        • Void
    • Avalanche.Writer
      • Introduction
      • ConstantWriter
      • Context
      • ConvertWriter
      • DefaultConstructor
      • DelegateWriter
      • PassthroughWriter
      • Referer
      • TypeCast
      • Writer
      • WriterPipe
      • WriterMessages

    Cache policy

    IRequestPolicy<CachePolicy> evaluates on each request type whether to cache or not. It must be provided on service construction to support caching.

    // Choose cache policy (Yes)
    IRequestPolicy<CachePolicy> cachePolicy = CachePolicies.DefaultYes;
    // Create service with cache
    IService service = Services.Create((ServiceHandlers.Instance), cachePolicy);
    

    Cache Policies

    CachePolicy is enumeration of three possible values.

    Key Description
    CachePolicy.ToCache Request type is to be cached.
    CachePolicy.ToNotCache Request type is not to be cached.
    CachePolicy.Unassigned No assignment for request type.
    If final evaluation result is Unassigned, then policy reverts to ToNotCache.


    CachePolicies is a facade that contains various cache policy rules:

    Key Applied Type Evaluation Result
    CachePolicies.Default UseInterface
    Others
    → ToCache
    → ToNotCache
    CachePolicies.DefaultYes IRequestNotToBeCached
    Others
    → ToNotCache
    → ToCache
    CachePolicies.ToCache All types → ToCache
    CachePolicies.ToNotCache All types → ToNotCache
    CachePolicies.UseInterface IRequestToBeCached
    IRequestNotToBeCached
    Others
    → ToCache
    → ToNotCache
    → Unassigned.
    CachePolicies.Cache<T> T → ToCache
    CachePolicies.Cache(Type requestType) requestType → ToCache
    CachePolicies.DontCache<T> T → ToNotCache
    CachePolicies.DontCache(Type requestType) requestType → ToNotCache
    CachePolicies.List(enumr) Evaluates all rules in enumr
    CachePolicies.Map(enumr) Creates lookup table from enumr.
    CachePolicies.Func(func) Invokes func.

    Custom cache Policy

    Custom policy can be created by appending rules with extension methods. Rules are evaluated in the order of appending.

    // Create cache policy
    IRequestPolicy<CachePolicy> cachePolicy =
        CachePolicies
            .DontCache<string>()
            .DontCache<Type>()
            .UseInterface()
            .CacheRest();
    

    .Coalesce() convertes preceding constant based rules into one lookup-table.

    // Create cache policy
    IRequestPolicy<CachePolicy> cachePolicy =
        CachePolicies
            .Cache<string>()
            .Cache<int>()
            .Cache<uint>()
            .DontCache<long>()
            .DontCache<ulong>()
            .DontCache<bool>()
            .Coalesce()
            .UseInterface()
            .DontCacheRest();
    

    .Func() applies a function to evaluate caching.

    // Create cache policy
    IRequestPolicy<CachePolicy> cachePolicy =
        CachePolicies
            .Func(t => t.Name.EndsWith("Cached") ? CachePolicy.ToCache : CachePolicy.Unassigned)
            .UseInterface()
            .DontCacheRest();
    


    There are extension methods that can be used for continuing cache policies.

    Key Applied Type Evaluation Result
    policy.Cache<T>() T → ToCache
    policy.Cache(Type requestType) requestType → ToCache
    policy.DontCache<T>() T → ToNotCache
    policy.DontCache(Type requestType) requestType → ToNotCache
    policy.UseInterface() IRequestToBeCachedUseInterface
    IRequestNotToBeCached
    Others
    → ToCache
    → ToNotCache
    → Unassigned
    policy.CacheRest() All types → ToCache
    policy.DontCacheRest() All types → ToNotCache
    policy.Coalesce() Coaleses preceding rules into a lookup-table.

    Disconnecting cache entries

    IEntryProviderBase.TryDisconnect() and .TryDisconnectAll() disconnects results from cache.

    // Create splitter
    Action<IQuery<string, string[]>> splitter = q => q.Response.SetValue(q.Request.Split(","));
    // Create service with cache
    IService<string, string[]> service = Services.Create<string, string[]>(splitter, CachePolicies.ToCache);
    // Create request
    string request = "car,bike,mountain";
    // Get-and-cache result
    string[] words = service.GetRequired(request);
    
    // Get cache
    (service as IEntryProviderBase).TryGetEntryCache(out IEntryCacheBase? cache);
    // Disconnect specific request
    cache!.TryDisconnect(request);
    // Disconnect all cache lines
    cache!.TryDisconnectAll();
    
    // Create result again
    string[] wordsAgain = service.GetRequired(request);
    // Test if we got different instances (expect to get false)
    WriteLine(Object.ReferenceEquals(words, wordsAgain));
    

    Full Example

    Full example
    using System;
    using Avalanche.Service;
    using static System.Console;
    
    public class service_cache
    {
        public static void Run()
        {
            {
                // <01>
                // Choose cache policy (Yes)
                IRequestPolicy<CachePolicy> cachePolicy = CachePolicies.DefaultYes;
                // Create service with cache
                IService service = Services.Create((ServiceHandlers.Instance), cachePolicy);
                // </01>
            }
            {
                // <02>
                // Create cache policy
                IRequestPolicy<CachePolicy> cachePolicy =
                    CachePolicies
                        .DontCache<string>()
                        .DontCache<Type>()
                        .UseInterface()
                        .CacheRest();
                // </02>
            }
            {
                // <03>
                // Create cache policy
                IRequestPolicy<CachePolicy> cachePolicy =
                    CachePolicies
                        .Cache<string>()
                        .Cache<int>()
                        .Cache<uint>()
                        .DontCache<long>()
                        .DontCache<ulong>()
                        .DontCache<bool>()
                        .Coalesce()
                        .UseInterface()
                        .DontCacheRest();
                // </03>
            }
            {
                // <04>
                // Create cache policy
                IRequestPolicy<CachePolicy> cachePolicy =
                    CachePolicies
                        .Func(t => t.Name.EndsWith("Cached") ? CachePolicy.ToCache : CachePolicy.Unassigned)
                        .UseInterface()
                        .DontCacheRest();
                // </04>
            }
            {
                // <05>
                // Create splitter
                Action<IQuery<string, string[]>> splitter = q => q.Response.SetValue(q.Request.Split(","));
                // Create service with cache
                IService<string, string[]> service = Services.Create<string, string[]>(splitter, CachePolicies.ToCache);
                // Create request
                string request = "car,bike,mountain";
                // Get-and-cache result
                string[] words = service.GetRequired(request);
    
                // Get cache
                (service as IEntryProviderBase).TryGetEntryCache(out IEntryCacheBase? cache);
                // Disconnect specific request
                cache!.TryDisconnect(request);
                // Disconnect all cache lines
                cache!.TryDisconnectAll();
    
                // Create result again
                string[] wordsAgain = service.GetRequired(request);
                // Test if we got different instances (expect to get false)
                WriteLine(Object.ReferenceEquals(words, wordsAgain));
                // </05>
            }
    
            // CachePolicies facade
            {
                var x = CachePolicies.ToCache;
                x = CachePolicies.ToNotCache;
                x = CachePolicies.Default;
                x = CachePolicies.DefaultYes;
                x = CachePolicies.UseInterface;
                x = x.Cache(typeof(string));
            }
    
        }
    }
    
    In This Article
    Back to top Copyright © Toni Kalajainen