E commerce 如何在多个项目中跟踪购物车?

E commerce 如何在多个项目中跟踪购物车?,e-commerce,shopping-cart,httpcontext,E Commerce,Shopping Cart,Httpcontext,首先是一些背景知识,我们正在创建一个新的“eGov”应用程序。最终,公民可以在网上申请许可证、支付执照、支付水电费和停车费。我们的愿景是有一个购物车,这样一个人可以在一次交易中支付多个项目。为了使事情组织得更好,我们将把每个部分分成不同的项目。这也允许我处理一个项目,而另一个开发人员处理另一个项目。付款人可以是注册用户,也可以是未注册用户。我们觉得一个不在我们管辖范围内的人可能不想仅仅为了支付停车费或一次性营业执照而注册 该项目将在Windows Server 2008和IIS7上使用ASP.N

首先是一些背景知识,我们正在创建一个新的“eGov”应用程序。最终,公民可以在网上申请许可证、支付执照、支付水电费和停车费。我们的愿景是有一个购物车,这样一个人可以在一次交易中支付多个项目。为了使事情组织得更好,我们将把每个部分分成不同的项目。这也允许我处理一个项目,而另一个开发人员处理另一个项目。付款人可以是注册用户,也可以是未注册用户。我们觉得一个不在我们管辖范围内的人可能不想仅仅为了支付停车费或一次性营业执照而注册

该项目将在Windows Server 2008和IIS7上使用ASP.NET MVC 3。我们可能会使用单个域(可能是egov.domain.gov)和多个子目录(/cart、/permit、/billing等),尽管这还不是100%确定的

现在问题来了。我们如何跨多个项目跟踪购物车?有人谈到使用在某一点过期的cookie或使用状态机。我们不确定使用会话id是否有效。如果我们使用状态机,我从来没有使用过它,只是在概念上理解它(它跨多台机器工作,因此使用它)

另一个注意事项是,我们将在VMWare服务器上构建此功能,因此将来可能会在多个服务器上运行此功能

你会用什么?为什么


更新:似乎许多人都建议将购物车存储在HttpContext中。这在多个应用程序中是否相同?

首先,您需要设置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
与您的购物车配合使用

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();
    }
这似乎对我很有用

    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();
    }