public SharedInformer(IInformer <TResource> masterInformer, ILogger logger, Func <TResource, TKey> keySelector, ICache <TKey, TResource> cache, IScheduler scheduler = null)
        {
            _cache            = cache;
            _masterScheduler  = scheduler ?? new EventLoopScheduler();
            _logger           = logger;
            _keySelector      = keySelector;
            _masterObservable = masterInformer
                                .GetResource(ResourceStreamType.ListWatch)

                                .ObserveOn(_masterScheduler)
                                .Do(x => _logger.LogTrace($"Received message from upstream {x}"))
                                .SynchronizeCache(_cache, _keySelector)
                                .Do(msg =>
            {
                // cache is synchronized as soon as we get at least one message past this point
                _logger.LogTrace($"Cache v{cache.Version} synchronized: {msg} ");
                _cacheSynchronized.TrySetResult(true);
                _logger.LogTrace("_cacheSynchronized.TrySetResult(true)");
            })
                                .Do(_ => YieldToWaitingSubscribers())
                                .ObserveOn(Scheduler.Immediate) // immediate ensures that all caches operations are done atomically
                                .ObserveOn(_masterScheduler)
                                .Catch <CacheSynchronized <ResourceEvent <TResource> >, Exception>(e =>
            {
                _cacheSynchronized.TrySetException(e);
                // _cacheSynchronized.OnError(e);
                return(Observable.Throw <CacheSynchronized <ResourceEvent <TResource> > >(e));
            })
                                .Finally(() => _cacheSynchronized.TrySetResult(false))
                                // .SubscribeOn(_masterScheduler)
                                .Publish();
        }
 public SharedOptionsInformer(
     IInformer <TResource, TOptions> masterInformer,
     Func <IInformer <TResource>, IInformer <TResource> > sharedInformerFactory)
 {
     _masterInformer        = masterInformer;
     _sharedInformerFactory = sharedInformerFactory;
 }
 public ContactRequestsController(ContactRequestRepository contactRequestRepository, IInformer informer)
 {
     _contactRequestRepository = contactRequestRepository;
     _informer = informer;
 }
 public SharedInformer(IInformer <TResource> masterInformer, ILogger logger, Func <TResource, TKey> keySelector)
     : this(masterInformer, logger, keySelector, new SimpleCache <TKey, TResource>(), null)
 {
 }
示例#5
0
 public ErrorCode setCallback(IInformer informer)
 {
     informer_ = informer;
     return ErrorCode.Success;
 }
示例#6
0
 public WrappedOptionsInformer(IInformer <TResource, TOptions> informer, TOptions options)
 {
     _informer = informer;
     _options  = options;
 }
示例#7
0
 /// <summary>
 /// Wraps an instance of <see cref="IInformer{TResource,TOptions}"/> as <see cref="IInformer{TResource}"/> by using the same
 /// set of <see cref="TOptions"/> for every subscription
 /// </summary>
 /// <param name="optionedInformer">The original instance of <see cref="IInformer{TResource,TOptions}"/></param>
 /// <param name="options">The options to use</param>
 /// <typeparam name="TResource">The type of resource</typeparam>
 /// <typeparam name="TOptions"></typeparam>
 /// <returns></returns>
 public static IInformer <TResource> WithOptions <TResource, TOptions>(this IInformer <TResource, TOptions> optionedInformer, TOptions options) =>
 new WrappedOptionsInformer <TResource, TOptions>(optionedInformer, options);