代码已托管在  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() 来实现数据的更新,从而把缓存区的上下文更改的数据一次提交到数据来实现事务。
public UnitOfWork()
: base("name=EntitiesDb")
{
this.Configuration.ProxyCreationEnabled = true;
this.Configuration.LazyLoadingEnabled = true;
} public void Commit()
{
base.SaveChanges();
} public void CommitAndRefreshChanges()
{
bool saveFailed = false; do
{
try
{
base.SaveChanges(); saveFailed = false; }
catch (DbUpdateConcurrencyException ex)
{
saveFailed = true; ex.Entries.ToList()
.ForEach(entry =>
{
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
}); }
} while (saveFailed); } public void RollbackChanges()
{
base.ChangeTracker.Entries()
.ToList()
.ForEach(entry => entry.State = EntityState.Unchanged);
}

1.2: Kt.DAL

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

public class Repository<T> : IRepository<T>
where T : class
{
#region Members IQueryableUnitOfWork _UnitOfWork; #endregion #region Constructor /// <summary>
/// 创建仓储实例
/// </summary>
/// <param name="unitOfWork">Associated Unit Of Work</param>
public Repository(IQueryableUnitOfWork unitOfWork)
{
if (unitOfWork == (IUnitOfWork)null)
throw new ArgumentNullException("unitOfWork"); _UnitOfWork = unitOfWork;
}

1.3:Kt.Respository

  User 表仓储类。

 public class UserRepository : Repository<User>, IUserRepository
{
public UserRepository(UnitOfWork unitOfWork)
: base(unitOfWork)
{ }
}

1.4:Kt.Service

  User 表类的业务层的实现

  public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
this._userRepository = userRepository;
} public UserDto GetUserById(int id)
{
return KtMapper.CreateMap<User, UserDto>(_userRepository.Get(id));
} public void AddUser(UserDto userDto)
{
User user = KtMapper.CreateMap<UserDto, User>(userDto);
_userRepository.Add(user);
_userRepository.UnitOfWork.Commit();
}

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

1.1、Kt.Web

  创建注入工厂

  /// <summary>
/// 依赖注入工厂
/// </summary>
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IKernel kernel; public WindsorControllerFactory(IKernel kernel)
{
this.kernel = kernel;
} public override void ReleaseController(IController controller)
{
kernel.ReleaseComponent(controller);
} protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
}
return (IController)kernel.Resolve(controllerType);
}
}

1.2、 Dependency 注入容器

 public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient()); container.Register( Component.For<IQueryableUnitOfWork, UnitOfWork>().ImplementedBy<UnitOfWork>(), Component.For<IUserRepository, UserRepository>().ImplementedBy<UserRepository>(), Component.For<IUserService>().ImplementedBy<UserService>(), AllTypes.FromThisAssembly().BasedOn<IHttpController>().LifestyleTransient() )
.AddFacility<LoggingFacility>(f => f.UseLog4Net()); LoggerFactory.SetCurrent(new TraceSourceLogFactory());
EntityValidatorFactory.SetCurrent(new DataAnnotationsEntityValidatorFactory());
}

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

 public class MvcApplication : System.Web.HttpApplication
{
private readonly IWindsorContainer container; public MvcApplication()
{
this.container =
new WindsorContainer().Install(new Dependency.Dependency());
} public override void Dispose()
{
this.container.Dispose();
base.Dispose();
}
protected void Application_Start()
{ AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
}

具体代码的实现见框架源代码: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. PHP API反射实例

    *反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用.其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言.php反射api由若干类组成,可帮助我们用来 ...

  2. ORA-14400: inserted partition key does not map to any partition

    ORA-14400: inserted partition key does not map to any partition 数据库表已经分区,如果插入数据时出现错误提示: ORA-14400: 插 ...

  3. 8051、ARM和DSP指令周期的测试与分析

    在实时嵌入式控制系统中,指令周期对系统的性能有至关重要的影响.介绍几种最常用的微控制器的工作机制,采用一段循环语句对这几种微控制器的指令周期进行测试,并进行分析比较.分析结论对系统控制器的选择有一定的 ...

  4. C# json Helper

    using System; using System.Collections.Generic; using System.Data; using System.Text; namespace Comm ...

  5. js Array数组的使用

    js Array数组的使用   Array是javascript中的一个事先定义好的对象(也可以称作一个类),可以直接使用 创建Array对象 var array=new Array(): 创建指定元 ...

  6. 2015第10周日CSS—3

    CSS各种居中方法 CSS的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法. 水平居中 1.行内元素水平居中(文本,图片) 给父层设置 text-align ...

  7. Linux下程序崩溃,ulimit,coredump,gdbserver

    操作系统:Ubuntu10.04 前言:    在程序崩溃后,如何快速定位问题.    以下方法适用于开发调试阶段,不太适用成品.    本文着眼于嵌入式,PC方面更简单.    核心:gdbserv ...

  8. 对Linux 专家非常有用的20 个命令

    谢谢你你给了我们在这篇文章前两个部分的喜欢,美言和支持.在第一部分文章中我们讨论了那些都只是切换到 Linux 和linux新手所需的必要知识的用户的命令. 对 Linux 新手非常有用的 20 个命 ...

  9. Linux 下的php,nginx,mysql的安装

    yum -y install wget make vim install gcc gcc-c++ ncurses ncurses-devel autoconf libjpeg libjpeg-deve ...

  10. Android学习总结——实现Home键功能

    实现Home键功能简而言之就是回到桌面,让Activity不销毁,程序后台运行. 实现方法: Intent intent= new Intent(Intent.ACTION_MAIN); intent ...