中大型系统架构组合之EF4.1+ASP.NET MVC+JQuery
2011-09-09 12:38
441 查看
EF4.1已经推出有一段时间了,它给人的第一吸引力就是比LINQTOSQL更加适合大型项目,它的封装更加紧密,操作也更加灵活,而且弥补了LINQToSQL的最大不足,可以支持多种数据库。
EF4.1+ASP.NETMVC+JQuery
第一先说一下EF4.1:
我们数据层OR/Mapping采用EF4.1来实现数据的持久化
我们必须要对EF4.1进行一个封装,把对数据的操作限制在DATA层,不能向上一层暴露太多实现的细节,这样作是安全的,层次分明的。
对数据操作有一个泛型接口来实现:
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
通过EntityRepository<TEntity>这个泛型类去实现上面接口,为表示层只公开操作及签名
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
当然,对于一个特殊的操作逻辑,我们要进行特殊的处理,如可以单独建立用户操作接口,产品操作接口等,而对于逻辑简单的模块,使用上面通过方法足以。
Entity实体层,我没有进行刻意的再封装,因为EF4.1帮助我们生成的代码已经基本满足了要求,它不向LINQTOSQL把操作与类实体混在一起,它是分开的。对于通用的更新操作,我们还需要人为干预一下Entity的实体类,如下:
IEntity通用接口会提供一个属于让继承它的实体类去实现,这个属性就是表主键,用来唯一确定一个实体。
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
实事上,Entity层是一个共享层,它可以同时被Data,Service和WebUI层访问,Service层用来与Data层直接进行交互。
它定义了User模块的逻辑实现接口,它的实现逻辑可以由多个类进行实现,这里面我们可以使用IOC以降低类的耦合度。如何实现IOC(控制反转)可以看我的这篇文章
由于篇幅较大,所以只给出接口代码:
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
WebUI层将会涉及到我们讲的ASP.NETMVC和JQuery
实事上,MVC是WebUI层的一种架构方式,它可以表代码与页面逻辑分离开,表码层控制与它下一层的信息交互,而页面表现层只负责输出HTML代码及JS效果。
我们看到图中还有一个Models,它就可以MVC中的M,它叫做视图模型,我理解为,它是与页面相关的,为页面提供数据的类实体,比如,为用户中心(包括登陆,注册,修改密码等等)提供显示及验证逻辑等功能的都写在LogOnModels这个类里,这样在修改显示信息时,直接去这个类里修改就可以了。
JQuery它是JS的一种功能强大的类库,当你建立一个MVC项目时,它会被自动添加进来,(看来微软也开源了,:P),它可以实现页面的扩展效果,如动态的列表,菜单,验证机制等等。
我们可以看到VS2010自代的版本是1.4.1,是目前较新版本,而-vsdoc.js是一个jquery代码智能提供的工具,有了jquery我们在写js脚本时就方便多了,看这是一个ajax请求的例子:
是不是很清晰,很方便呢!如果想了解更多的js知识,可以看这篇文章
今天就写到这吧!
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
EF4.1+ASP.NETMVC+JQuery
第一先说一下EF4.1:
我们数据层OR/Mapping采用EF4.1来实现数据的持久化
我们必须要对EF4.1进行一个封装,把对数据的操作限制在DATA层,不能向上一层暴露太多实现的细节,这样作是安全的,层次分明的。
对数据操作有一个泛型接口来实现:
namespaceData
{
///<summary>
///数据操作统一接口(插入,查詢,刪除,更新)
///</summary>
publicinterfaceIEntityRepository<TEntity>whereTEntity:class//这里使用泛型接口
{
///<summary>
///插入单条记录
///</summary>
voidInsert(TEntityentity);
///<summary>
///插入列表
///</summary>
voidInsert(IList<TEntity>list);
///<summary>
///删除单条记录
///</summary>
///<paramname="entity"></param>
voidDelete(TEntityentity);
///<summary>
///删除列表
///</summary>
///<paramname="list"></param>
voidDelete(IList<TEntity>list);
///<summary>
///更新单条记录
///</summary>
///<paramname="entity"></param>
voidUpdate(TEntityentity);
///<summary>
///更新列表
///</summary>
///<paramname="list"></param>
voidUpdate(IList<TEntity>list);
///<summary>
///得到实体列表
///</summary>
///<returns></returns>
IDbSet<TEntity>GetList();
TEntityGetEntityById(TEntityentity);
}
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
通过EntityRepository<TEntity>这个泛型类去实现上面接口,为表示层只公开操作及签名
namespaceData
{
///<summary>
///数据操作实现类(统一实现类)
///</summary>
///<typeparamname="TEntity"></typeparam>
publicclassEntityRepository<TEntity>:RepositoryBase,IEntityRepository<TEntity>
whereTEntity:class,Entity.IEntity
{
#regionIEntityRepository<TEntity>Members
publicvoidInsert(TEntityentity)
{
this.Db.Set<TEntity>().Add(entity);
this.Db.Entry(entity).State=System.Data.EntityState.Added;
this.SaveChanges();
}
publicvoidInsert(IList<TEntity>list)
{
list.ToList().ForEach(entity=>
{
this.Db.Set<TEntity>().Add(entity);
this.Db.Entry(entity).State=System.Data.EntityState.Added;
});
this.SaveChanges();
}
publicvoidDelete(TEntityentity)
{
this.Db.Set<TEntity>().Remove(entity);
this.Db.Entry(entity).State=System.Data.EntityState.Deleted;
this.SaveChanges();
}
publicvoidDelete(IList<TEntity>list)
{
list.ToList().ForEach(entity=>
{
this.Db.Set<TEntity>().Remove(entity);
this.Db.Entry(entity).State=System.Data.EntityState.Deleted;
});
this.SaveChanges();
}
publicSystem.Data.Entity.IDbSet<TEntity>GetList()
{
returnthis.Db.Set<TEntity>();
}
publicTEntityGetEntityById(TEntityentity)
{
returnthis.Db.Set<TEntity>().Find(entity.Id);
}
publicvoidUpdate(TEntityentity)
{
varentry=this.Db.Entry(entity);//从DbContext类型的对象
if(entry.State==EntityState.Detached)
{
varentityToUpdate=this.Db.Set<TEntity>().Find(entity.Id);
EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<TEntity,
TEntity>().Map(entity,entityToUpdate);
this.SaveChanges();
}
}
publicvoidUpdate(IList<TEntity>list)
{
list.ToList().ForEach(entity=>
{
varentry=this.Db.Entry(entity);
if(entry.State==EntityState.Detached)
{
varentityToUpdate=this.Db.Set<TEntity>().Find(entity.Id);
EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<TEntity,
TEntity>().Map(entity,entityToUpdate);
this.SaveChanges();
}
});
}
#endregion
///<summary>
///操作提交
///</summary>
publicoverridevoidSaveChanges()
{
base.SaveChanges();
}
}
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
当然,对于一个特殊的操作逻辑,我们要进行特殊的处理,如可以单独建立用户操作接口,产品操作接口等,而对于逻辑简单的模块,使用上面通过方法足以。
Entity实体层,我没有进行刻意的再封装,因为EF4.1帮助我们生成的代码已经基本满足了要求,它不向LINQTOSQL把操作与类实体混在一起,它是分开的。对于通用的更新操作,我们还需要人为干预一下Entity的实体类,如下:
IEntity通用接口会提供一个属于让继承它的实体类去实现,这个属性就是表主键,用来唯一确定一个实体。
namespaceEntity
{
///<summary>
///实体模块统一接口
///</summary>
publicinterfaceIEntity
{
///<summary>
///为了主键统一,而手动设置的
///TODO:这是为了泛型的统一操作而设计的,非常经典
///</summary>
stringId{get;}
}
}
而Menu这个实体会这样描述它:
namespaceEntity.Entities
{
publicclassMenu:Entity.IEntity
{
publicMenu()
{
this.Role_Menus=newList<Role_Menus>();
}
publicintMenuID{get;set;}
publicstringURL{get;set;}
publicintParentID{get;set;}
publicstringMenuName{get;set;}
publicSystem.DateTimeCreateDate{get;set;}
publicSystem.DateTimeUpdateDate{get;set;}
publicintStatus{get;set;}
publicintSortNum{get;set;}
publicstringOperator{get;set;}
publicintType{get;set;}
publicvirtualICollection<Role_Menus>Role_Menus{get;set;}
#regionIEntity成员
publicstringId
{
get{returnthis.MenuID.ToString();}
}
#endregion
}
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
实事上,Entity层是一个共享层,它可以同时被Data,Service和WebUI层访问,Service层用来与Data层直接进行交互。
它定义了User模块的逻辑实现接口,它的实现逻辑可以由多个类进行实现,这里面我们可以使用IOC以降低类的耦合度。
由于篇幅较大,所以只给出接口代码:
namespaceService
{
publicinterfaceIUserService
{
List<Entity.Entities.UserBas>GetUserBases();
Entity.Entities.UserBasGetUserBaseById(stringid);
voidAddUserBase(Entity.Entities.UserBasentity);
voidModifyUserBase(Entity.Entities.UserBasentity);
voidDeleteUserBase(Entity.Entities.UserBasentity);
voidDeleteUserBase(List<Entity.Entities.UserBas>entity);
}
}
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
WebUI层将会涉及到我们讲的ASP.NETMVC和JQuery
实事上,MVC是WebUI层的一种架构方式,它可以表代码与页面逻辑分离开,表码层控制与它下一层的信息交互,而页面表现层只负责输出HTML代码及JS效果。
我们看到图中还有一个Models,它就可以MVC中的M,它叫做视图模型,我理解为,它是与页面相关的,为页面提供数据的类实体,比如,为用户中心(包括登陆,注册,修改密码等等)提供显示及验证逻辑等功能的都写在LogOnModels这个类里,这样在修改显示信息时,直接去这个类里修改就可以了。
JQuery它是JS的一种功能强大的类库,当你建立一个MVC项目时,它会被自动添加进来,(看来微软也开源了,:P),它可以实现页面的扩展效果,如动态的列表,菜单,验证机制等等。
我们可以看到VS2010自代的版本是1.4.1,是目前较新版本,而-vsdoc.js是一个jquery代码智能提供的工具,有了jquery我们在写js脚本时就方便多了,看这是一个ajax请求的例子:
functionlist(id){
$("#cateid").val(id);
clickHoverColor();
$.ajax({
type:"POST",
url:"/down/List",
data:{cateid:id},
success:function(data){
$("#list").html(data);
}
});
是不是很清晰,很方便呢!
今天就写到这吧!
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
相关文章推荐
- 关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性 (转)
- ASP.NET MVC+Entity Framework 4.1访问数据库 (EF)
- 大型高性能ASP.NET系统架构设计
- OXite 微软一款基于asp.net mvc架构的blog内容管理系统
- asp.net、mvc、ajax、js、jquery、sql、EF、linq、netadvantage第三方控件知识点笔记
- 大型高性能ASP.NET系统架构设计
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发
- 大型高性能ASP.NET系统架构设计
- 关于大型asp.net应用系统的架构-架构的选择
- 【转载】关于大型asp.net应用系统的架构-架构的选择
- 关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
- 大型高性能ASP.NET系统架构设计
- Spring.NET企业架构实践之 JQuery + FlexiGrid + ASP.NET MVC + NVelocity + WCF + LINQ + NHibernate 综合应用
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建
- 应用ASP.NET MVC的系统软件架构-知识普及篇1
- 关于大型asp.net应用系统的架构-架构的选择
- 大型高性能ASP.NET系统架构设计
- 关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
- 【转载】关于大型asp.net应用系统的架构—如何做到高性能高可伸缩性
- 转:关于大型asp.net应用系统的架构-架构的选择