zoukankan      html  css  js  c++  java
  • MVC4商城项目一:框架设计

    代码已托管在  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);
            }
    View Code

    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;
            }
    View Code

    1.3:Kt.Respository

      User 表仓储类。

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

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

    二、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(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
                }
                return (IController)kernel.Resolve(controllerType);
            }
        }
    View Code

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

    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);
            }
        }
    View Code

    具体代码的实现见框架源代码: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  ……

  • 相关阅读:
    数据库第1,2,3范式学习
    node.js安装及小例子
    WorkSkill整理之 技能体系
    PTE 准备之 Read aloud
    PTE 准备之 Personal introduction
    PTE准备的时候,用英式英语还是美式英语
    sqlserver2014无法打开报Cannot find one or more components_修复方案
    beego 框架用的页面样式模板
    Go语言开发中MongoDB数据库
    xmind8 破解激活教程
  • 原文地址:https://www.cnblogs.com/inline/p/3865186.html
Copyright © 2011-2022 走看看