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) { }
public ErrorCode setCallback(IInformer informer) { informer_ = informer; return ErrorCode.Success; }
public WrappedOptionsInformer(IInformer <TResource, TOptions> informer, TOptions options) { _informer = informer; _options = options; }
/// <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);