代码已托管在  https://code.csdn.net/denghao156/ktnmb_mvc4

先上图,设计模式参考:ddmvc4.codeplex.com

一、unintofwork  设计模式  http://www.cnblogs.com/zxj159/p/3505457.html
     Unit Of Work模式会记录所有对象模型修改过的信息,在提交的时候,一次性修改,并把结果同步到数据库。 这个过程通常被封装在事务中。所以在DAL中采用Unit Of Work模式好处就在于能够确保数据的完整性,如果在持有一系列业务对象(同属于一个事务)的过程中出现问题,就可以将所有的修改回滚,以确保数据始终处于有效状态,不会出现脏数据。
1.1:Kt.DAL.UnitOfWork
   UnitOfWork  继承  DbContext 实现对实体模型的增删改查,通过base.SaveChanges() 来实现数据的更新,从而把缓存区的上下文更改的数据一次提交到数据来实现事务。
  1. public UnitOfWork()
  2. : base("name=EntitiesDb")
  3. {
  4. this.Configuration.ProxyCreationEnabled = true;
  5. this.Configuration.LazyLoadingEnabled = true;
  6. }
  7.  
  8. public void Commit()
  9. {
  10. base.SaveChanges();
  11. }
  12.  
  13. public void CommitAndRefreshChanges()
  14. {
  15. bool saveFailed = false;
  16.  
  17. do
  18. {
  19. try
  20. {
  21. base.SaveChanges();
  22.  
  23. saveFailed = false;
  24.  
  25. }
  26. catch (DbUpdateConcurrencyException ex)
  27. {
  28. saveFailed = true;
  29.  
  30. ex.Entries.ToList()
  31. .ForEach(entry =>
  32. {
  33. entry.OriginalValues.SetValues(entry.GetDatabaseValues());
  34. });
  35.  
  36. }
  37. } while (saveFailed);
  38.  
  39. }
  40.  
  41. public void RollbackChanges()
  42. {
  43. base.ChangeTracker.Entries()
  44. .ToList()
  45. .ForEach(entry => entry.State = EntityState.Unchanged);
  46. }

1.2: Kt.DAL

  基础仓储类对UnitOfWork 的引用来实现多个表实体的统一操作。

  1. public class Repository<T> : IRepository<T>
  2. where T : class
  3. {
  4. #region Members
  5.  
  6. IQueryableUnitOfWork _UnitOfWork;
  7.  
  8. #endregion
  9.  
  10. #region Constructor
  11.  
  12. /// <summary>
  13. /// 创建仓储实例
  14. /// </summary>
  15. /// <param name="unitOfWork">Associated Unit Of Work</param>
  16. public Repository(IQueryableUnitOfWork unitOfWork)
  17. {
  18. if (unitOfWork == (IUnitOfWork)null)
  19. throw new ArgumentNullException("unitOfWork");
  20.  
  21. _UnitOfWork = unitOfWork;
  22. }

1.3:Kt.Respository

  User 表仓储类。

  1. public class UserRepository : Repository<User>, IUserRepository
  2. {
  3. public UserRepository(UnitOfWork unitOfWork)
  4. : base(unitOfWork)
  5. {
  6.  
  7. }
  8. }

1.4:Kt.Service

  User 表类的业务层的实现

  1. public class UserService : IUserService
  2. {
  3. private readonly IUserRepository _userRepository;
  4. public UserService(IUserRepository userRepository)
  5. {
  6. this._userRepository = userRepository;
  7. }
  8.  
  9. public UserDto GetUserById(int id)
  10. {
  11. return KtMapper.CreateMap<User, UserDto>(_userRepository.Get(id));
  12. }
  13.  
  14. public void AddUser(UserDto userDto)
  15. {
  16. User user = KtMapper.CreateMap<UserDto, User>(userDto);
  17. _userRepository.Add(user);
  18. _userRepository.UnitOfWork.Commit();
  19. }

二、Castle Windsor DI  MVC控制器依赖注入

1.1、Kt.Web

  创建注入工厂

  1. /// <summary>
  2. /// 依赖注入工厂
  3. /// </summary>
  4. public class WindsorControllerFactory : DefaultControllerFactory
  5. {
  6. private readonly IKernel kernel;
  7.  
  8. public WindsorControllerFactory(IKernel kernel)
  9. {
  10. this.kernel = kernel;
  11. }
  12.  
  13. public override void ReleaseController(IController controller)
  14. {
  15. kernel.ReleaseComponent(controller);
  16. }
  17.  
  18. protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
  19. {
  20. if (controllerType == null)
  21. {
  22. throw new HttpException(, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
  23. }
  24. return (IController)kernel.Resolve(controllerType);
  25. }
  26. }

1.2、 Dependency 注入容器

  1. public void Install(IWindsorContainer container, IConfigurationStore store)
  2. {
  3. container.Register(Classes.FromThisAssembly()
  4. .BasedOn<IController>()
  5. .LifestyleTransient());
  6.  
  7. container.Register(
  8.  
  9. Component.For<IQueryableUnitOfWork, UnitOfWork>().ImplementedBy<UnitOfWork>(),
  10.  
  11. Component.For<IUserRepository, UserRepository>().ImplementedBy<UserRepository>(),
  12.  
  13. Component.For<IUserService>().ImplementedBy<UserService>(),
  14.  
  15. AllTypes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient()
  16.  
  17. )
  18. .AddFacility<LoggingFacility>(f => f.UseLog4Net());
  19.  
  20. LoggerFactory.SetCurrent(new TraceSourceLogFactory());
  21. EntityValidatorFactory.SetCurrent(new DataAnnotationsEntityValidatorFactory());
  22. }

1.3、MvcApplication 应用程序启动时控制器的依赖注入容器的实现

  1. public class MvcApplication : System.Web.HttpApplication
  2. {
  3. private readonly IWindsorContainer container;
  4.  
  5. public MvcApplication()
  6. {
  7. this.container =
  8. new WindsorContainer().Install(new Dependency.Dependency());
  9. }
  10.  
  11. public override void Dispose()
  12. {
  13. this.container.Dispose();
  14. base.Dispose();
  15. }
  16. protected void Application_Start()
  17. {
  18.  
  19. AreaRegistration.RegisterAllAreas();
  20.  
  21. WebApiConfig.Register(GlobalConfiguration.Configuration);
  22. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  23. RouteConfig.RegisterRoutes(RouteTable.Routes);
  24. BundleConfig.RegisterBundles(BundleTable.Bundles);
  25.  
  26. var controllerFactory = new WindsorControllerFactory(container.Kernel);
  27. ControllerBuilder.Current.SetControllerFactory(controllerFactory);
  28. }
  29. }

具体代码的实现见框架源代码:https://code.csdn.net/denghao156/ktnmb_mvc4

预计用的工具有:

  • Visual Studio 2012
  • ASP.NET MVC 4 with Razor View Engine
  • Entity Framework 5.0
  • Castle Windsor for DI
  • SQL Server 2008/2012
  • bootstrapt & JQuery
  • automapper

本节参见大神所写,日后想自己做一个商城出来,代码持续更新到 code.csdn.net  ……

MVC4商城项目一:框架设计的更多相关文章

  1. MVC4商城项目三:分部视图在导航条上的应用

    写了几天发觉大部分时间用在JS上了,本来想写个musicstore,却加了框架,然后又想用后台,然后又想用上bootstrapt,然后又想弄权限设计,然后又想………… 看来是想多了~ 好吧,最近把后台 ...

  2. MVC4商城项目四:应用Bundle捆绑压缩技术

    从MVC4开始,我们就发现,项目中对Global.asax进行了优化,将原来在MVC3中使用的代码移到了[App_Start]文件夹下,而Global.asax只负责初始化.其中的BundleConf ...

  3. MVC4商城项目二:用户身份验证的实现

    用户身份验证,依赖于 forms 身份验证类:FormsAuthentication,它是一串加密的cookie 来实现对控制器访问限制和登陆页面的访问控制.它在浏览器端是这样子的: 需求:我们要实现 ...

  4. 【iOS】小项目框架设计(ReactiveCocoa+MVVM+AFNetworking+FMDB)

    上一个项目使用到了ReactiveCocoa+MVVM+AFNetworking+FMDB框架设计,从最初的尝试,到后来不断思考和学习,现在对这样一个整体设计还是有了一定了理解与心得.在此与大家分享下 ...

  5. 仿联想商城laravel实战---1、仿联想商城需求和数据库设计(lavarel如何搭建项目)

    仿联想商城laravel实战---1.仿联想商城需求和数据库设计(lavarel如何搭建项目) 一.总结 一句话总结: composer引入lavarel.配置域名.配置apache 1.项目名 le ...

  6. 品优购商城项目(三)安全框架SpringSecurity

    品优购商城项目第三阶段 1.springSecurity的基本用法与shiro类似. 2.BCrypt加密算法比MD5更加智能和安全,能自动加盐再加密,生成的密码是60位比md5的32位更占空间(可以 ...

  7. python框架Django实战商城项目之工程搭建

    项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...

  8. 游戏UI框架设计(6): 消息传递中心

    游戏UI框架设计(6) --消息传递中心 最近一直忙于一个益智类游戏的研发工作,所以博客有段时间没有更新了.经过朋友的督促,决定这两天立刻完成最后的两篇博客讲解(UI框架).说起“消息传递中心”,或者 ...

  9. ThinkPHP3.2开发仿京东商城项目实战视频教程

    ThinkPHP3.2仿京东商城视频教程实战课程,ThinkPHP3.2开发大型商城项目实战视频 第一天 1.项目说明 2.时间插件.XSS过滤.在线编辑器使用 3.商品的删除 4.商品的修改完成-一 ...

随机推荐

  1. github orgmode

    http://blog.nicky1605.com/application-github-page.html http://dayigu.github.io/WhyUseOrgModeToWriteB ...

  2. SqlCommand类

    一.常用属性 CommandText 获取或设置要对数据源执行的 Transact-SQL 语句.表名或存储过程. CommandTimeout 获取或设置在终止执行命令的尝试并生成错误之前的等待时间 ...

  3. 【转】在Eclipse中安装和使用TFS插件

    文章地址:http://www.cnblogs.com/judastree/archive/2012/09/05/2672640.html 问题: 在Eclipse中安装和使用TFS插件. 解决过程: ...

  4. Binary Tree Paths 解答

    Question Given a binary tree, return all root-to-leaf paths. For example, given the following binary ...

  5. Struts2 学习笔记 10 Result部分 part1

    1.关于Result我们首先来学习一下结果类型 result type. 先来看struts.xml. struts.xml <?xml version="1.0" enco ...

  6. HBase 3、HBase练习题

    1.建立学生和课程表 要求:学生可以选择多个课程,每个课程可以被多个学生选择. 查询某个学生所选的所有课程列表 查询某个课程,的学生列表 学生可以修改所选的课程 方案:学生与课程之间是多对多关系,那可 ...

  7. HDU-1016-素数环

    /* 将1-n个数放在环中,保证相邻的两个数的和是素数 第一个数字永远是1 就这两个约束条件 第一个难点是计算素数: 参考文献: http://c.biancheng.net/cpp/html/254 ...

  8. UGUI Button控件

    今天一起来学习下Button控件, Button控件其实是由Text,Button,Image组件形成的. 这里就简单介绍下Button组件 Interactable: 代表该组件是否进行交互, 我们 ...

  9. Cocos2d-X中实现菜单特效

    Cocos2d-X中能够讲菜单和动作结合起来使用实现菜单特效 程序实例1:使用菜单和动作的组合实现菜单特效<一> #include "MenuItem.h" CCSce ...

  10. Android项目能运行,上传svn后再下载却不能运行

    今天遇到一个比较奇怪的问题,android项目上传到svn之前,可以运行,但是上传到svn后再check, 就出错. 搜索了一下,发现真的解决了问题. svn 不知道是出于什么原因,不能上传.so文件 ...