先上代码:

1. ShoppingCartService 类
using System;
using System.Collections.Generic;
using System.Linq;
using LinFx;
using LinFx.Data;
using LinFx.Security;
using LinFx.Web;
using YLSPay.Data.Entity; namespace YLSPay.Data.Service
{
public class ShoppingCartService : IShoppingCartService
{
private readonly IWorkContext _context;
private readonly IRepository<ShoppingCart> _repository; public ShoppingCartService(
IWorkContext context,
IRepository<ShoppingCart> repository)
{
_context = context;
_repository = repository;
} /// <summary>
/// 加入购物车
/// </summary>
/// <param name="user">用户</param>
/// <param name="productVariant">商品</param>
/// <param name="qty">数量</param>
/// <param name="attributes">属性</param>
public void AddToShoppingCart(IUser user, ProductVariant productVariant, int qty, string attributes)
{
if (productVariant == null)
throw new ArgumentNullException("productVariant"); //购物车保存至数据库
ShoppingCart cartItem; var query = _repository.Table.Where(p => p.ProductVariantId == productVariant.Id && p.Attributes == attributes);
if (user == null)
{
var recordId = GetRecordId(null);
cartItem = query.SingleOrDefault(p => p.RecordId == recordId) ?? CreateShoppingCart(recordId);
}
else
{
cartItem = query.SingleOrDefault(p => p.UserId == user.Id) ?? CreateShoppingCart(null, user);
} cartItem.Attributes = attributes;
cartItem.ProductVariantId = productVariant.Id;
cartItem.Quantity += qty;
cartItem.UpdateTime = DateTime.Now; _repository.Save();
} public string GetRecordId(string username)
{
const string name = "recordId"; //if (_context.HttpContext.Response.Cookies[name] == null)
//{
// var cookie = new System.Web.HttpCookie(name)
// {
// Expires = DateTime.Now.AddMinutes(30),
// Value = _context.User != null ? _context.User.UserName : Guid.NewGuid().ToString()
// };
// _context.HttpContext.Response.Cookies.Add(cookie);
// return cookie.Value;
//}
//return _context.HttpContext.Response.Cookies[name].Value; if (_context.HttpContext.Session[name] == null)
{
if(string.IsNullOrEmpty(username))
_context.HttpContext.Session[name] = Guid.NewGuid().ToString();
else
_context.HttpContext.Session[name] = username;
}
return _context.HttpContext.Session[name].ToString();
} }
}

  2. IWorkContext

using System.Web;
using LinFx.Security; namespace LinFx.Web
{
public interface IWorkContext
{
IUser User { get; set; }
HttpContextBase HttpContext { get; }
}
}
using System.Web;
using LinFx.Security; namespace LinFx.Web
{
public class WorkContext : IWorkContext
{
public IUser User { get; set; }
//private readonly HttpContextBase _httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); public HttpContextBase HttpContext
{
get { return new HttpContextWrapper(System.Web.HttpContext.Current); }
} //public WorkContext(HttpContextBase contextBase)
//{
// _httpContext = contextBase;
//} //public HttpContextBase HttpContext
//{
// get { return _httpContext; }
//}
}
}

  

  

3.  Ninject 注入

using LinFx.Caching;
using LinFx.Data;
using LinFx.Index;
using LinFx.Plugin.Search.Services;
using LinFx.Security;
using LinFx.Web;
using YLSPay.Data;
using YLSPay.Data.Service; [assembly: WebActivator.PreApplicationStartMethod(typeof(YLSPay.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(YLSPay.App_Start.NinjectWebCommon), "Stop")] namespace YLSPay.App_Start
{
using System;
using System.Web; using Microsoft.Web.Infrastructure.DynamicModuleHelper; using Ninject;
using Ninject.Web.Common;
using System.Data.Entity; public static class NinjectWebCommon
{
static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
} /// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
} /// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel);
return kernel;
} /// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<HttpContext>().ToMethod(ctx => HttpContext.Current).InRequestScope();
kernel.Bind<HttpContextBase>().ToMethod(ctx => new HttpContextWrapper(HttpContext.Current)).InRequestScope(); kernel.Bind<IWorkContext>().To<WorkContext>().InSingletonScope(); kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope(); }
}
}

  

问题:

一。如果实现 方步 GetRecordId() 从 cooike 取 ?

二。_context.HttpContext  是会每次都新生成?

每次 new

ShoppingCartService  时就 new 一个 httpcontext ?

各位兄弟,有漏洞吗

 可能思路不对
cooike 要保存什么东西? 
 
 未登录时情况
一个guid值? 然后 购物车 数据 保存 数据库存? 

asp.net mvc cooike 购物车 如何实现的更多相关文章

  1. 在ASP.NET MVC实现购物车,尝试一种不同于平常的购物车显示方式

    通常,我们看到的购物车是这样的: 虽然这种购物车显示方式被广泛运用,但我个人觉得不够直观.如果换成这样呢? 本篇的源码放在了:https://github.com/darrenji/ShoppingC ...

  2. 【Pro ASP.NET MVC 3 Framework】.学习笔记.7.SportsStore:购物车

    3 创建购物车 每个商品旁边都要显示Add to cart按钮.点击按钮后,会显示客户已经选中的商品的摘要,包括总金额.在购物车里,用户可以点击继续购物按钮返回product目录.也可以点击Check ...

  3. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

    在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...

  4. 自学MVC看这里——全网最全ASP.NET MVC 教程汇总

    MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...

  5. ASP.NET MVC 5 05 - 视图

    PS: 唉,这篇随笔国庆(2015年)放假前几天开始的,放完假回来正好又赶上年底,公司各种破事儿. 这尼玛都写跨年了都,真服了.(=_=#) 好几次不想写了都. 可是又不想浪费这么多,狠不下心删除.没 ...

  6. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  7. ASP.NET MVC学前篇之Ninject的初步了解

    ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...

  8. [ASP.NET MVC 小牛之路]02 - C#知识点提要

    本人博客已转移至:http://www.exblr.com/liam  本篇博文主要对asp.net mvc开发需要撑握的C#语言知识点进行简单回顾,尤其是C# 3.0才有的一些C#语言特性.对于正在 ...

  9. [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject

    本人博客已转移至:http://www.exblr.com/liam  为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...

随机推荐

  1. 编程小计——消除Graphics图像边缘颜色不纯(抗锯齿)

    在很多时候,我们都要绘制纯色的图片,而用Graphics生成的往往是不纯的,尤其是绘制文字时.比如说绘制纯红色文字,往往R达不到255. C#中默认抗锯齿,给人看起来柔和:但是我们现实中往往用到锯齿. ...

  2. mongodb查询之模糊查询

    mongodb的模糊查询是用正则表达式来实现的.例子如下: db.COMMODITY_COMMODITY_SHOP.find({name:{$regex :/南京/i}})

  3. CSS3 3D转换

    CSS3允许你使用3D转换来对元素进行格式化. 3D转换方法: rotateX() rotateY() 浏览器支持 属性 浏览器支持 transform           IE10和Firefox支 ...

  4. CSS3 用户界面

    CSS3用户界面 在CSS3中,新的用户界面特性包括重设元素尺寸,盒尺寸以及轮廓等. 用户界面属性: resize box-sizing outline-offset 浏览器支持 属性 浏览器支持 r ...

  5. (转)用JS判断ckeditor3.6版本编辑器内容为空的方法

    因为编者我还是一个初学入门者,无论是JS还是PHP,都是懂了点皮毛.今天在研究ckeditor编辑器的时候遇到了一些问题,虽然这只是我的个人问题,但觉得可以分享给其他人,或许也有像我这样的初学者也会遇 ...

  6. jQuery入门必须掌握的一些API

    jQuery 中文版文档:http://www.css88.com/jqapi-1.9/category/ajax/ jQuery入门,必须掌握以下的API,平时工作中经常会用到.未列出的API,在掌 ...

  7. 营配数据质量核查,关于营销mis系统与配电gis系统里面的sql语句查询,做为积累使用,下次就不用重复写同样的语句了。

    1.配电gis线路导出数据: select r.name 线路名称,r.run_status 运行状态,r.voltage_level 电压等级,r.manager_depart 管理部门,r.bel ...

  8. 怎样取得数组对象和arralist 的长度

    数组用length属性 ArrayList用size()方法

  9. java+tomcat 在 linux下的部署

    一.配置JAVA运行环境 1.安装jdk. 从sun公司网站www.sun.com下载linux版本的jdk, 建议使用jdk1.6版本.地址http://java.sun.com/javase/do ...

  10. 自己动手写框架——IoC的实现

    先看看 IoC百度百科 优化过程 namespace Test { class Program { static void Main(string[] args) { //场景 某公司客服要回访一些客 ...