public IRestResource GetFullResource(IDeferredItem <TItem> item, IDataTransaction dataTransaction) { IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter); var eventWrapper = new DataEventWrapper <TNav>(dataTransaction, navRepository); eventWrapper.TryWrapEvents(_navTools.RepoEvents); var context = new FullEngineContext <TNav>(eventWrapper.Transaction, eventWrapper.Repository, _subContext); return(new EngineRestCollection <TNav>(context)); }
public IRestCollection GetRestCollection() { IDataTransaction transaction = _dataSource.CreateTransaction(); // TODO setup disposing of transaction IEngineRepository <TItem> repository = _dataSource.GetRepository <TItem>(transaction); var wrapper = new DataEventWrapper <TItem>(transaction, repository); wrapper.TryWrapEvents(_events); IEngineContext <TItem> context = new FullEngineContext <TItem>(wrapper.Transaction, wrapper.Repository, _subContext); return(new EngineRestCollection <TItem>(context)); }
public IRestResource GetFullResource(IDeferredItem <TItem> item, IDataTransaction dataTransaction) { //TNav navItem = _navTools.NavExpression.Compile().Invoke(item.LoadedItem); //var itemRepository = new LoadedItemRepository<TNav>(navItem); IQueryableSingle <TNav> navigationQuery = item.Query.Select(_navTools.NavExpression).SingleDefferred(); var itemRepository = new QueryableSingleRepository <TNav>(navigationQuery); var eventWrapper = new DataEventWrapper <TNav>(dataTransaction, itemRepository); eventWrapper.TryWrapEvents(_navTools.RepoEvents); var context = new FullEngineContext <TNav>(eventWrapper.Transaction, eventWrapper.Repository, _engineSubContext); var deferredNavItem = new RepositoryDeferredItem <TNav>(itemRepository); return(new EngineRestItem <TNav>(context, deferredNavItem)); }
public IRestCollection GetRestCollection(Stem <TItem> stem) { IDataTransaction transaction = _dataSource.CreateTransaction(); stem.OnDispose += delegate { transaction.Dispose(); }; IEngineRepository <TItem> repository = _dataSource.GetRepository <TItem>(transaction); var wrapper = new DataEventWrapper <TItem>(transaction, repository); wrapper.TryWrapEvents(new StemDataChangeEvents <TItem>(stem)); var subContext = new StemsEngineSubContext <TItem>(stem); var context = new FullEngineContext <TItem>(wrapper.Transaction, wrapper.Repository, subContext); return(new EngineRestCollection <TItem>(context)); }
public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction) { IEngineRepository <TNav> navRepository = new NavigationItemRepository <TItem, TNav>(item, _navTools.NavExpression, _navTools.Setter); var itemData = new RestItemData(deserializedValue); var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext); DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync); try { IDataTransaction transaction = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ? var navContext = new FullEngineContext <TNav>(transaction, navRepository, _subContext); var navEngineItem = new EngineRestItem <TNav>(navContext, deferredItem); Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData); } catch (RestApiException ex) { throw new SubWriterException(ex, item); } }
public async Task SetValueAsync(IDeferredItem <TItem> item, object deserializedValue, IDataTransaction dataTransaction) { IEngineRepository <TNav> navRepository = new NavigationCollectionRepository <TItem, TCollection, TNav>(item, _navTools.NavExpression, _navTools.Setter); IDataTransaction transaction = new VoidTransaction(); // we commit the transaction in the parent. TODO optional save-as-you-go ? var navContext = new FullEngineContext <TNav>(transaction, navRepository, _subContext); var navLocatorCreator = new NavigationItemLocatorCreator <TNav>(_subContext); IEnumerable deserializedCollection = (IEnumerable)deserializedValue; // todo null ? foreach (object deserializedItem in deserializedCollection) { var itemData = new RestItemData(deserializedItem); DeferredItemBase <TNav> deferredItem = await navLocatorCreator.LocateOrCreateItemAsync(navRepository, itemData, item.LoadAsync); var navEngineItem = new EngineRestItem <TNav>(navContext, deferredItem); Acknowledgment acknowledgment = await navEngineItem.EditAsync(itemData); } // TODO: remove items that were not located? }