Exemplo n.º 1
0
        public Task <T> GetAsync <T, TState>(string key) where T : StatefulObject <TState>
        {
            Guard.NotNull(key, nameof(key));

            lock (lockObject)
            {
                if (statesCache.TryGetValue <ObjectHolder <T, TState> >(key, out var stateObj))
                {
                    return(stateObj.ActivateAsync());
                }

                var state = (T)services.GetService(typeof(T));

                var stateHolder = new StateHolder <TState>(key, () =>
                {
                    pubSub.Publish(new InvalidateMessage {
                        Key = key
                    }, false);
                }, store);

                stateObj = new ObjectHolder <T, TState>(state, stateHolder);

                statesCache.CreateEntry(key)
                .SetValue(stateObj)
                .SetAbsoluteExpiration(CacheDuration)
                .Dispose();

                return(stateObj.ActivateAsync());
            }
        }
Exemplo n.º 2
0
        public Task <T> GetSingleAsync <T, TKey>(TKey key) where T : IStatefulObject <TKey>
        {
            Guard.NotNull(key, nameof(key));

            lock (lockObject)
            {
                if (statesCache.TryGetValue <ObjectHolder <T, TKey> >(key, out var stateObj))
                {
                    return(stateObj.ActivateAsync());
                }

                var state = (T)services.GetService(typeof(T));

                var stateStore = new Store <T, TKey>(eventStore, eventDataFormatter, services, streamNameResolver,
                                                     () =>
                {
                    pubSub.Publish(new InvalidateMessage {
                        Key = key.ToString()
                    }, false);
                }, () =>
                {
                    statesCache.Remove(key);
                });

                stateObj = new ObjectHolder <T, TKey>(state, key, stateStore);

                statesCache.CreateEntry(key)
                .SetValue(stateObj)
                .SetAbsoluteExpiration(CacheDuration)
                .Dispose();

                return(stateObj.ActivateAsync());
            }
        }
Exemplo n.º 3
0
        public Task <T> GetSingleAsync <T, TKey>(TKey key) where T : IStatefulObject <TKey>
        {
            Guard.NotNull(key, nameof(key));

            lock (lockObject)
            {
                if (statesCache.TryGetValue <ObjectHolder <T, TKey> >(key, out var stateObj))
                {
                    return(stateObj.ActivateAsync());
                }

                var state = (T)services.GetService(typeof(T));

                stateObj = new ObjectHolder <T, TKey>(state, key);

                statesCache.CreateEntry(key)
                .SetValue(stateObj)
                .SetAbsoluteExpiration(CacheDuration)
                .Dispose();

                return(stateObj.ActivateAsync());
            }
        }