private ICommand CreateBuyBookCommand(PurchaseBookService purchaseService,
                                              IWishListRepository wishListRepository,
                                              IMessageQueue messaging)
        {
            return(new Command(
                       execute: async() =>
            {
                IsBusy = true;
                try
                {
                    purchaseService.PurchaseAsync(m_book);
                    m_bookViewModel.PurchasedCount += 1;

                    await wishListRepository.RemoveAsync(m_book);

                    ChangeCanCommandExecute(PurchaseBook);
                    UpdateCanBookBeAddedToWishList(m_book);

                    messaging.Send(this, BookPurchased, m_book);
                }
                catch (Exception ex)
                {
                    m_messaging.Send(this, ex);
                }
                IsBusy = false;
            }, canExecute: () =>
            {
                return Book != null && purchaseService.IsMoneyEnoughForPurchase(m_book);
            }));
        }
        public PurchaseBookViewModel(IBookRepository bookRepository,
                                     IReviewRepository reviewRepository,
                                     IMessageQueue messaging,
                                     IWishListRepository wishListRepository,
                                     WriteReviewViewModel newReview,
                                     PurchaseBookService purchaseService)
        {
            m_booksRepository    = bookRepository;
            m_reviewRepository   = reviewRepository;
            m_wishListRepository = wishListRepository;
            m_purchaseService    = purchaseService;
            m_messaging          = messaging;

            NewReview = newReview;
            Reviews   = new ObservableRangeCollection <Review>();

            PurchaseBook    = CreateBuyBookCommand(purchaseService, wishListRepository, messaging);
            AddWishList     = CreateAddWishListCommand(purchaseService, wishListRepository);
            ShowBookCover   = CreateShowBookCoverCommand(messaging);
            SubmitNewReview = CreateSubmitNewReviewCommand(reviewRepository);

            newReview.PropertyChanged += (sender, args) =>
            {
                ChangeCanCommandExecute(SubmitNewReview);
            };
        }
 private ICommand CreateAddWishListCommand(PurchaseBookService purchaseService, IWishListRepository wishListRepository)
 {
     return(new Command(
                execute: async() =>
     {
         IsBusy = true;
         try
         {
             m_canAddToWishList = false;
             ChangeCanCommandExecute(AddWishList);
             await wishListRepository.AddAsync(m_book);
         }
         catch (Exception ex)
         {
             m_canAddToWishList = true;
             ChangeCanCommandExecute(AddWishList);
             m_messaging.Send(this, ex);
         }
         IsBusy = false;
     }, canExecute: () =>
     {
         return m_canAddToWishList;
     }));
 }