/// <summary>Integrates Unity when the application starts.</summary>
        public static void Start()
        {
            var container = ContainerManager.GetConfiguredContainer();

            UnityConfig.RegisterTypes(container);

            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType <FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            //http://stackoverflow.com/questions/699852/how-to-find-all-the-classes-which-implement-a-given-interface
            foreach (var assembly in assemblies)
            {
                var instances = from t in assembly.GetTypes()
                                where t.GetInterfaces().Contains(typeof(IDependencyRegister)) &&
                                t.GetConstructor(Type.EmptyTypes) != null
                                select Activator.CreateInstance(t) as IDependencyRegister;

                foreach (var instance in instances.OrderBy(x => x.Order))
                {
                    instance.Register(container);
                }
            }

            // TODO: Uncomment if you want to use PerRequestLifetimeManager
            // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
        }
        public async Task <ActionResult> OrderAction(int id, int status)
        {
            var order = await _orderService.FindAsync(id);

            if (order == null)
            {
                return(new HttpNotFoundResult());
            }

            var descriptor = _pluginFinder.GetPluginDescriptorBySystemName <IHookPlugin>(order.PaymentPlugin);

            if (descriptor == null)
            {
                return(new HttpNotFoundResult("Not found"));
            }

            var controllerType = descriptor.Instance <IHookPlugin>().GetControllerType();
            var controller     = ContainerManager.GetConfiguredContainer().Resolve(controllerType) as IPaymentController;

            string message     = string.Empty;
            var    orderResult = controller.OrderAction(id, status, out message);

            var result = new
            {
                Success = orderResult,
                Message = message
            };

            return(Json(result, JsonRequestBehavior.AllowGet));
        }
示例#3
0
        /// <summary>Integrates Unity when the application starts.</summary>
        public static void Start()
        {
            var container = ContainerManager.GetConfiguredContainer();

            UnityConfig.RegisterTypes(container);

            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType <FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            try
            {
                //http://stackoverflow.com/questions/699852/how-to-find-all-the-classes-which-implement-a-given-interface
                foreach (var assembly in assemblies)
                {
                    var instances = from t in assembly.GetTypes()
                                    where t.GetInterfaces().Contains(typeof(IDependencyRegister)) &&
                                    t.GetConstructor(Type.EmptyTypes) != null
                                    select Activator.CreateInstance(t) as IDependencyRegister;

                    foreach (var instance in instances.OrderBy(x => x.Order))
                    {
                        instance.Register(container);
                    }
                }
            }
            catch (ReflectionTypeLoadException ex)
            {
http:           //stackoverflow.com/questions/1091853/error-message-unable-to-load-one-or-more-of-the-requested-types-retrieve-the-l
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                foreach (Exception exSub in ex.LoaderExceptions)
                {
                    sb.AppendLine(exSub.Message);
                    System.IO.FileNotFoundException exFileNotFound = exSub as System.IO.FileNotFoundException;
                    if (exFileNotFound != null)
                    {
                        if (!string.IsNullOrEmpty(exFileNotFound.FusionLog))
                        {
                            sb.AppendLine("Fusion Log:");
                            sb.AppendLine(exFileNotFound.FusionLog);
                        }
                    }
                    sb.AppendLine();
                }
                string errorMessage = sb.ToString();

                throw new Exception(errorMessage, ex);
                //Display or log the error based on your application.
            }


            // TODO: Uncomment if you want to use PerRequestLifetimeManager
            // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
        }
示例#4
0
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            var container = ContainerManager.GetConfiguredContainer();

            UnityOfWork.RegisterTypes(container);
        }
示例#5
0
        /// <summary>
        /// Resolve only after application start up
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public virtual T Instance <T>() where T : class, IPlugin
        {
            object instance = ContainerManager.GetConfiguredContainer().Resolve(PluginType);

            // Might resolve unregistered...

            var typedInstance = instance as T;

            if (typedInstance != null)
            {
                typedInstance.PluginDescriptor = this;
            }
            return(typedInstance);
        }
示例#6
0
        public ActionResult Index()
        {
            var model = CacheHelper.Statistics;

            model.TransactionCount = 0;

            // Get transaction count
            var descriptors = _pluginFinder.GetPluginDescriptors(LoadPluginsMode.InstalledOnly, "Payment");

            foreach (var descriptor in descriptors)
            {
                var controllerType = descriptor.Instance <IHookPlugin>().GetControllerType();
                var controller     = ContainerManager.GetConfiguredContainer().Resolve(controllerType) as IPaymentController;
                model.TransactionCount += controller.GetTransactionCount();
            }

            return(View("Dashboard", model));
        }
        public async Task <ActionResult> OrderAction(int id, int status)
        {
            var orderQuery = await _orderService.Query(x => x.ID == id).Include(x => x.Listing).SelectAsync();

            var order = orderQuery.FirstOrDefault();

            if (order == null)
            {
                return(new HttpNotFoundResult());
            }

            var currentUserId = User.Identity.GetUserId();

            // Unauthorized access
            if (order.UserProvider != currentUserId && order.UserReceiver != currentUserId)
            {
                return(new HttpUnauthorizedResult());
            }

            var descriptor = _pluginFinder.GetPluginDescriptorBySystemName <IHookPlugin>(order.PaymentPlugin);

            if (descriptor == null)
            {
                return(new HttpNotFoundResult("Not found"));
            }

            var controllerType = descriptor.Instance <IHookPlugin>().GetControllerType();
            var controller     = ContainerManager.GetConfiguredContainer().Resolve(controllerType) as IPaymentController;

            string message     = string.Empty;
            var    orderResult = controller.OrderAction(id, status, out message);

            var orderStatus     = (Enum_OrderStatus)status;
            var orderStatusText = string.Empty;

            switch (orderStatus)
            {
            case Enum_OrderStatus.Created:
            case Enum_OrderStatus.Pending:
                orderStatusText = "[[[Pending]]]";
                break;

            case Enum_OrderStatus.Confirmed:
                orderStatusText = "[[[Confirmed]]]";
                break;

            case Enum_OrderStatus.Cancelled:
                orderStatusText = "[[[Cancelled]]]";
                break;

            default:
                orderStatusText = orderStatus.ToString();
                break;
            }

            var result = new
            {
                Success = orderResult,
                Message = message
            };

            if (orderResult)
            {
                // Send message to the user
                var messageSend = new MessageSendModel()
                {
                    UserFrom  = currentUserId,
                    UserTo    = order.UserProvider == currentUserId ? order.UserReceiver : order.UserProvider,
                    ListingID = order.ListingID,
                    Subject   = order.Listing.Title,
                    Body      = HttpContext.ParseAndTranslate(string.Format(
                                                                  "[[[Order %0 - %1 - Total Price %2 %3. <a href=\"%4\">See Details</a>|||{0}|||{1}|||{2}|||{3}|||{4}]]]",
                                                                  HttpContext.ParseAndTranslate(orderStatusText),
                                                                  HttpContext.ParseAndTranslate(order.Description),
                                                                  order.Price,
                                                                  order.Currency,
                                                                  Url.Action("Orders")))
                };

                await MessageHelper.SendMessage(messageSend);
            }

            TempData[TempDataKeys.UserMessage] = string.Format("[[[The order is %0.|||{0}]]]", orderStatus);

            return(Json(result, JsonRequestBehavior.AllowGet));
        }
示例#8
0
        /// <summary>Disposes the Unity container when the application is shut down.</summary>
        public static void Shutdown()
        {
            var container = ContainerManager.GetConfiguredContainer();

            container.Dispose();
        }
示例#9
0
        public async Task <ActionResult> Order(Order order)
        {
            var listing = await _listingService.FindAsync(order.ListingID);

            if (listing == null)
            {
                return(new HttpNotFoundResult());
            }

            var userCurrent = User.Identity.User();

            // Check if payment method is setup on user or the platform
            var descriptors = _pluginFinder.GetPluginDescriptors <IHookPlugin>(LoadPluginsMode.InstalledOnly, "Payment").Where(x => x.Enabled);

            if (descriptors.Count() == 0)
            {
                TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                TempData[TempDataKeys.UserMessage]           = "[[[The provider has not setup the payment option yet, please contact the provider.]]]";

                return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
            }

            foreach (var descriptor in descriptors)
            {
                var controllerType = descriptor.Instance <IHookPlugin>().GetControllerType();
                var controller     = ContainerManager.GetConfiguredContainer().Resolve(controllerType) as IPaymentController;

                if (!controller.HasPaymentMethod(listing.UserID))
                {
                    TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                    TempData[TempDataKeys.UserMessage]           = string.Format("[[[The provider has not setup the payment option for {0} yet, please contact the provider.]]]", descriptor.FriendlyName);

                    return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
                }
            }

            if (order.ID == 0)
            {
                order.ObjectState   = Repository.Pattern.Infrastructure.ObjectState.Added;
                order.Created       = DateTime.Now;
                order.Modified      = DateTime.Now;
                order.Status        = (int)Enum_OrderStatus.Created;
                order.UserProvider  = listing.UserID;
                order.UserReceiver  = userCurrent.Id;
                order.ListingTypeID = order.ListingTypeID;
                order.Currency      = listing.Currency;

                if (order.UserProvider == order.UserReceiver)
                {
                    TempData[TempDataKeys.UserMessageAlertState] = "bg-danger";
                    TempData[TempDataKeys.UserMessage]           = "[[[You cannot book the item from yourself!]]]";

                    return(RedirectToAction("Listing", "Listing", new { id = order.ListingID }));
                }

                if (order.ToDate.HasValue && order.FromDate.HasValue)
                {
                    order.Description = HttpContext.ParseAndTranslate(
                        string.Format("{0} #{1} ([[[From]]] {2} [[[To]]] {3})",
                                      listing.Title,
                                      listing.ID,
                                      order.FromDate.Value.ToShortDateString(),
                                      order.ToDate.Value.ToShortDateString()));

                    order.Quantity = order.ToDate.Value.Date.AddDays(1).Subtract(order.FromDate.Value.Date).Days;
                    order.Price    = order.Quantity * listing.Price;
                }
                else if (order.Quantity.HasValue)
                {
                    order.Description = string.Format("{0} #{1}", listing.Title, listing.ID);
                    order.Quantity    = order.Quantity.Value;
                    order.Price       = listing.Price;
                }
                else
                {
                    // Default
                    order.Description = string.Format("{0} #{1}", listing.Title, listing.ID);
                    order.Quantity    = 1;
                    order.Price       = listing.Price;
                }

                _orderService.Insert(order);
            }

            await _unitOfWorkAsync.SaveChangesAsync();

            ClearCache();

            return(RedirectToAction("Payment", new { id = order.ID }));
        }
示例#10
0
        /// <summary>
        /// Send Message
        /// </summary>
        /// <param name="userFrom"></param>
        /// <param name="userTo"></param>
        /// <param name="subject"></param>
        /// <param name="body"></param>
        /// <returns></returns>
        public static async Task SendMessage(MessageSendModel messageModel)
        {
            var unitOfWork = ContainerManager.GetConfiguredContainer().Resolve <IUnitOfWorkAsync>();

            MessageThread messageThread;

            // Use message subject to find the message thread if no listing id is provided
            if (!messageModel.ListingID.HasValue)
            {
                var messageThreadQuery = await MessageThreadService
                                         .Query(x =>
                                                x.Subject.Equals(messageModel.Subject, StringComparison.InvariantCultureIgnoreCase) &&
                                                x.MessageParticipants.Any(y => y.UserID == messageModel.UserFrom) &&
                                                x.MessageParticipants.Any(y => y.UserID == messageModel.UserTo))
                                         .SelectAsync();

                messageThread = messageThreadQuery.FirstOrDefault();
            }
            else
            {
                // Otherwise, use listing ID
                var messageThreadQuery = await MessageThreadService
                                         .Query(x => x.ListingID == messageModel.ListingID)
                                         .SelectAsync();

                messageThread = messageThreadQuery.FirstOrDefault();
            }

            // Create message thread if there is not one yet.
            if (messageThread == null)
            {
                messageThread = new MessageThread()
                {
                    Subject     = messageModel.Subject,
                    ListingID   = messageModel.ListingID,
                    Created     = DateTime.Now,
                    LastUpdated = DateTime.Now,
                    ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added
                };

                MessageThreadService.Insert(messageThread);

                await UnitOfWorkAsync.SaveChangesAsync();

                // Add message participants
                MessageParticipantService.Insert(new MessageParticipant()
                {
                    UserID          = messageModel.UserFrom,
                    MessageThreadID = messageThread.ID,
                    ObjectState     = Repository.Pattern.Infrastructure.ObjectState.Added
                });

                MessageParticipantService.Insert(new MessageParticipant()
                {
                    UserID          = messageModel.UserTo,
                    MessageThreadID = messageThread.ID,
                    ObjectState     = Repository.Pattern.Infrastructure.ObjectState.Added
                });
            }

            // Insert mail message to db
            var message = new Message()
            {
                UserFrom        = messageModel.UserFrom,
                Body            = messageModel.Body,
                MessageThreadID = messageThread.ID,
                Created         = DateTime.Now,
                LastUpdated     = DateTime.Now,
                ObjectState     = Repository.Pattern.Infrastructure.ObjectState.Added
            };

            MessageService.Insert(message);

            await UnitOfWorkAsync.SaveChangesAsync();

            // Add read state of messages
            MessageReadStateService.Insert(new MessageReadState()
            {
                MessageID   = message.ID,
                UserID      = messageModel.UserFrom,
                ReadDate    = DateTime.Now,
                ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added
            });

            MessageReadStateService.Insert(new MessageReadState()
            {
                MessageID   = message.ID,
                UserID      = messageModel.UserTo,
                ReadDate    = null,
                ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added
            });

            await UnitOfWorkAsync.SaveChangesAsync();
        }