Пример #1
0
        public async Task Modify(Action <T> modifer)
        {
            AccessInterceptor inter = null;
            T proxy = default(T);

            using (await _lock.ReaderLock())
            {
                inter = new AccessInterceptor(_state, true);
                proxy = _createProxy(inter);
            }

            using (inter)
            {
                using (await _lock.WriterLock())
                {
                    modifer(proxy);
                }

                // now that the lock is released, it's time to raise the proper events
                var literalEventTasks = inter.ChangedLiterals()
                                        .Where(pair => _events.ContainsKey(pair.prop))
                                        .Select(pair => _events[pair.prop].Invoke(pair.value));

                var collectionEventTasks = inter.ChangedCollections()
                                           .Where(item => _events.ContainsKey(item.Key))
                                           .Select(item => _events[item.Key].Invoke(
                                                       _createCollectionChangesArg(item, inter.OldCollectionValue(item.Key))));

                await Task.WhenAll(literalEventTasks.Concat(collectionEventTasks));
            }
        }
Пример #2
0
 public ServiceStore(Action <T> init)
     : this()
 {
     using (var inter = new AccessInterceptor(_state, true))
     {
         var proxy = _createProxy(inter);
         init(proxy);
     }
 }
Пример #3
0
 public CollectionProxy(
     List <T> list,
     AccessInterceptor interceptor,
     Action <IChange> onChange,
     bool modifiable)
 {
     _interceptor = interceptor;
     _list        = list;
     _onChange    = onChange;
     _modifiable  = modifiable;
 }
Пример #4
0
        public async Task <K> Select <K>(Func <T, K> query)
        {
            AccessInterceptor inter = null;
            T proxy = default(T);
            K res   = default(K);


            using (await _lock.ReaderLock())
            {
                using (inter = new AccessInterceptor(_state, false))
                {
                    proxy = _createProxy(inter);
                    res   = query(proxy);
                }
            }

            return(res);
        }
Пример #5
0
        private T _createProxy(AccessInterceptor interceptor)
        {
            var proxy = _proxyGenerator.CreateInterfaceProxyWithoutTarget <T>(interceptor);

            return(proxy);
        }