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  ……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM