Как я могу отслеживать корзину в нескольких проектах? - PullRequest
2 голосов
/ 12 сентября 2011

Сначала немного предыстории, мы создаем новое приложение "eGov". В конце концов, гражданин может запросить разрешения и оплатить лицензии, а также оплатить счета за коммунальные услуги и парковочные билеты онлайн. Наше видение имеет корзину для покупок, поэтому человек может оплатить несколько товаров за одну транзакцию. Чтобы все было организовано лучше, мы собираемся разбить каждый раздел на отдельный проект. Это также позволяет мне работать над одним проектом, в то время как другой разработчик работает над другим. Лицо, осуществляющее платеж, может быть зарегистрированным пользователем или оставаться незарегистрированным. Мы считаем, что человек из нашей юрисдикции, вероятно, не хочет регистрироваться только для того, чтобы оплатить парковочный билет или единовременную лицензию на ведение бизнеса.

Этот проект будет работать на Windows Server 2008 и IIS7 и использовать ASP.NET MVC 3. Вероятно, мы будем использовать один домен (например, egov.domain.gov) и несколько подкаталогов (/ cart, / allow, / billing). и т.д.), хотя это еще не решено на 100%.

Теперь проблема. Как мы отслеживаем корзину покупок по нескольким проектам? Говорили об использовании файла cookie, срок действия которого истекает в определенный момент, или об использовании конечного автомата. Мы не уверены, сработает ли использование идентификатора сессии. Если мы используем конечный автомат, я никогда не использовал его и понимаю только концептуально (он работает на нескольких машинах, и SO его использует).

Еще одно замечание: мы собираемся построить это на сервере VMWare, поэтому возможность его запуска на нескольких серверах возможна в будущем.

Что бы вы использовали и почему?

Обновление : похоже, многие рекомендуют хранить корзину в HttpContext. Это одинаково для нескольких приложений?

1 Ответ

1 голос
/ 16 сентября 2011

Сначала вам нужно настроить SQL Server на прием соединений в состоянии сеанса.

Затем добавьте следующее в файл Web.config:

<sessionState mode="SQLServer" sqlConnectionString="Server=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=ASPState;Application Name=name" timeout="20" allowCustomSqlDatabase="true" />` within `<system.web>

Затем я создал библиотеку классов, в которой есть два класса: Cart и CartItem.

CartItem, определенные для хранения каждого отдельного элемента корзины покупок

[Serializable]
public class CartItem
{
    [Key]
    public int RecordId { set; get; }
    public string ItemNumber { set; get; }
    public string Description { set; get; }
    public DateTime DateTimeCreated { set; get; }
    public decimal Cost { get; set; }
}

Cart работает с вашей корзиной покупок

public class Cart
{
    HttpContextBase httpContextBase = null;
    public const string CartSessionKey = "shoppingCart";

    /// <summary>
    /// Initializes a new instance of the <see cref="ShoppingCart"/> class.
    /// </summary>
    /// <param name="context">The context.</param>
    public Cart(HttpContextBase context)
    {
        httpContextBase = context;
    }

    /// <summary>
    /// Gets the cart items.
    /// </summary>
    /// <returns></returns>
    public List<CartItem> GetCartItems()
    {
        return (List<CartItem>)httpContextBase.Session[CartSessionKey];
    }

    /// <summary>
    /// Adds to cart.
    /// </summary>
    /// <param name="cartItem">The cart item.</param>
    public void AddToCart(CartItem cartItem)
    {
        var shoppingCart = GetCartItems();

        if (shoppingCart == null)
        {
            shoppingCart = new List<CartItem>();
        }

        cartItem.RecordId = shoppingCart.Count + 1;
        cartItem.DateTimeCreated = DateTime.Now;
        shoppingCart.Add(cartItem);

        httpContextBase.Session[CartSessionKey] = shoppingCart;
    }

    /// <summary>
    /// Removes from cart.
    /// </summary>
    /// <param name="id">The id.</param>
    public void RemoveFromCart(int id)
    {
        var shoppingCart = GetCartItems();
        var cartItem = shoppingCart.Single(cart => cart.RecordId == id);
        shoppingCart.Remove(cartItem);
        httpContextBase.Session[CartSessionKey] = shoppingCart;
    }

    /// <summary>
    /// Empties the cart.
    /// </summary>
    public void EmptyCart()
    {
        httpContextBase.Session[CartSessionKey] = null;
    }

    /// <summary>
    /// Gets the count.
    /// </summary>
    /// <returns></returns>
    public int GetCount()
    {
        return GetCartItems().Count;
    }

    /// <summary>
    /// Gets the total.
    /// </summary>
    /// <returns></returns>
    public decimal GetTotal()
    {
        return GetCartItems().Sum(items => items.Cost);
    }
}

Чтобы проверить это, сначала в своем проекте корзины покупок в домашнем контроллере я сделал следующее:

    public ActionResult Index()
    {
        var shoppingCart = new Cart(this.HttpContext);
        var cartItem = new CartItem
        {
            Description = "Item 1",
            ItemNumber = "123"
            Cost = 20,
            DateTimeCreated = DateTime.Now
        };

        shoppingCart.AddToCart(cartItem);

        cartItem = new CartItem
        {
            Description = "Item 2",
            ItemNumber = "234"
            Cost = 15,
            DateTimeCreated = DateTime.Now
        };

        shoppingCart.AddToCart(cartItem);

        var viewModel = new ShoppingCartViewModel
        {
            CartItems = shoppingCart.GetCartItems(),
            CartTotal = shoppingCart.GetTotal()
        };

        return View(viewModel);
    }

В домашнем контроллере моего второго проекта я добавил следующее:

    public ActionResult Index()
    {
        var shoppingCart = new Cart(this.HttpContext);
        var cartItem = new CartItem
        {
            Description = "Item 3",
            ItemNumber = "345"
            Cost = 55,
            DateTimeCreated = DateTime.Now
        };

        shoppingCart.AddToCart(cartItem);

        return View();
    }

Мне показалось, что это отлично работает.

...