HTML5技术

Portal.MVC —— nopcommerce的简化版 - stoneniqiu

字号+ 作者:H5之家 来源:H5之家 2015-12-04 12:16 我要评论( )

Portal.MVC 简介 项目是基于MVC4+EF,带有角色,权限,用户中心及账户相关(登录,注册,修改密码,找回密码等)等基本功能。参考的开源项目 nopcommerce,这是一个电商架构的MVC项目,我对其进行了简化,之前主要是方便我自己搭建一些小的网站。包含前台和后台。

Portal.MVC 简介

项目是基于MVC4+EF,带有角色,权限,用户中心及账户相关(登录,注册,修改密码,找回密码等)等基本功能。参考的开源项目 nopcommerce,这是一个电商架构的MVC项目,我对其进行了简化,之前主要是方便我自己搭建一些小的网站。包含前台和后台。

界面浏览

1.首页。这是前天晚上临时做出来的Logo和页面。不是真实案例,大家可以结合实际项目再修改。

2.登录框

2.注册框

3.邮箱密码找回,这个地方要用还需要配置邮箱服务器。

4.用户中心

 4.后台管理,使用的Matrix Admin 模板。这是一个很好用的模板,是衍生于Bootstrap。

 

 用户管理,这里excel导出用的是NPIO。

 

 不知道有没有提起园友的兴趣,下面我讲一下代码部分。

功能介绍

我没有做分太多的层级,这样比较直观,核心的部分在Niqiu.Core类库里面.分四个部分

 

而网站部分重要的有一些可以复用的Attributes,AccountController等,比如UserLastActivityIpAttribute,会记录用户的Ip并更新最后访问时间。

下面介绍下2个我认为重要点的部分

Ninject依赖注入:

Nop中使用的是Autofac,并构建了一个强大的EnginContext管理所有的依赖注入项,在这个项目中我拿掉了这一部分,换成Ninject来完成IOC的工作。并不涉及这两个组件的优劣问题,而且我认为前者的功能更要强悍一些。Ninject是在NinjectWebCommon类中注册的.它在App_Start文件夹下。 如下:

kernel.Bind<IPermissionservice>().To<Permissionservice>();

Ninject更详细的介绍请看我的博客:Ninject在MVC5中的使用。在不能用构造函数的地方,可以用属性注入。

[Inject] public IWorkContext WorkContext { get; set; } [Inject] public IUserService UserService { get; set; }

而有的Service需要用到HttpContext,这对象没有接口,是无法注册的,但可以通过HttpContextWrapper获得。

public HttpContextBase HttpContext { get { return new HttpContextWrapper(System.Web.HttpContext.Current); } }

HttpContextBase 是一个抽象类,HttpContextWrapper是其派生成员。这两者都是.Net3.5之后才出现。

更多的解释大家可以看老赵的博客:为什么是HttpContextBase而不是IHttpContext

领域设计

 这个部分网上讨论的比较多,Nop是采用的单个仓库接口IRepository<T>,然后实现不同的服务。定义IDbContext,注入数据库对象。

 IRepository<T>:

public interface IRepository<T> where T:BaseEntity { Gets the by id. T GetById(object id); Inserts the specified entity. Insert(T entity); Inserts the specified entities. Insert(IEnumerable<T> entities); Updates the specified entity. Update(T entity); Deletes the specified entity. Delete(T entity); Gets the table. IQueryable<T> Table { get; } Gets the tables no tracking. IQueryable<T> TableNoTracking { get; } }

View Code

用EfRepository<T>实现这个接口

public class EfRepository<T>:IRepository<T> where T:BaseEntity { #region Fields private readonly IDbContext _context ; private IDbSet<T> _entities; #endregion public EfRepository(IDbContext context) { if (context == null) { ); } _context = context; } #region property protected virtual IDbSet<T> Entities { get { if (_entities == null) { _entities = _context.Set<T>(); } return _entities ?? (_entities = _context.Set<T>()); // _entities ?? _entities = db.Set<T>(); } } Gets a table IQueryable<T> Table { get { return Entities; } } public IQueryable<T> TableNoTracking { get { return Entities.AsNoTracking(); } } T GetById(object id) { return Entities.Find(id); } public void Insert(T entity) { try { ); Entities.Add(entity); _context.SaveChanges(); } catch (DbEntityValidationException dbEx) { GetException(dbEx); } } Insert entities Insert(IEnumerable<T> entities) { try { if (entities == null) ); foreach (var entity in entities) Entities.Add(entity); _context.SaveChanges(); } catch (DbEntityValidationException dbEx) { GetException(dbEx); } } Update entity Update(T entity) { try { if (entity == null) ); _context.SaveChanges(); } catch (DbEntityValidationException dbEx) { GetException(dbEx); } } Delete entity Delete(T entity) { try { if (entity == null) ); Entities.Remove(entity); _context.SaveChanges(); } catch (DbEntityValidationException dbEx) { GetException(dbEx); } } Delete entities Delete(IEnumerable<T> entities) { try { if (entities == null) ); foreach (var entity in entities) Entities.Remove(entity); _context.SaveChanges(); } catch (DbEntityValidationException dbEx) { GetException(dbEx); } } GetException(DbEntityValidationException dbEx) { var msg = string.Empty; foreach (var validationErrors in dbEx.EntityValidationErrors) foreach (var validationError in validationErrors.ValidationErrors) msg += Environment.NewLine + , validationError.PropertyName, validationError.ErrorMessage); var fail = new Exception(msg, dbEx); fail; } }

View Code

而其中的IDbContext是自定义的数据接口

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 简化版的易企秀---可视化搭建滑屏应用 - gaogaolater

    简化版的易企秀---可视化搭建滑屏应用 - gaogaolater

    2015-11-24 18:32

  • HTML代码简化应遵循的原则_HTML教程

    HTML代码简化应遵循的原则_HTML教程

    2015-09-19 18:50

网友点评
r