中大型系统架构组合之EF4.1+ASP.NET MVC+JQuery

EF4.1已经推出有一段时间了,它给人的第一吸引力就是比LINQ TO SQL更加适合大型项目,它的封装更加紧密,操作也更加灵活,而且弥补了LINQ To SQL的最大不足,可以支持多种数据库。

 

EF4.1+ASP.NET MVC+JQuery

第一先说一下EF4.1:

我们数据层OR/Mapping采用EF4.1来实现数据的持久化

我们必须要对EF4.1进行一个封装,把对数据的操作限制在DATA层,不能向上一层暴露太多实现的细节,这样作是安全的,层次分明的。

对数据操作有一个泛型接口来实现:

namespace Data
{
    /// <summary>
    /// 数据操作统一接口(插入,查詢,刪除,更新)
    /// </summary>
    public interface IEntityRepository<TEntity> where TEntity : class //这里使用泛型接口
    {
 
        /// <summary>
        /// 插入单条记录
        /// </summary>
        void Insert(TEntity entity);
 
        /// <summary>
        /// 插入列表
        /// </summary>
        void Insert(IList<TEntity> list);
 
        /// <summary>
        /// 删除单条记录
        /// </summary>
        /// <param name="entity"></param>
        void Delete(TEntity entity);
 
        /// <summary>
        /// 删除列表
        /// </summary>
        /// <param name="list"></param>
        void Delete(IList<TEntity> list);
 
        /// <summary>
        /// 更新单条记录
        /// </summary>
        /// <param name="entity"></param>
        void Update(TEntity entity);
 
        /// <summary>
        /// 更新列表
        /// </summary>
        /// <param name="list"></param>
        void Update(IList<TEntity> list);
 
        /// <summary>
        /// 得到实体列表
        /// </summary>
        /// <returns></returns>
        IDbSet<TEntity> GetList();
 
        TEntity GetEntityById(TEntity entity);
    }
 
}

通过EntityRepository<TEntity> 这个泛型类去实现上面接口,为表示层只公开操作及签名

namespace Data
{
    /// <summary>
    /// 数据操作实现类(统一实现类)
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class EntityRepository<TEntity> : RepositoryBase, IEntityRepository<TEntity>
        where TEntity : class,Entity.IEntity
    {
        #region IEntityRepository<TEntity> Members
 
        public void Insert(TEntity entity)
        {
            this.Db.Set<TEntity>().Add(entity);
            this.Db.Entry(entity).State = System.Data.EntityState.Added;
            this.SaveChanges();
        }
 
        public void Insert(IList<TEntity> list)
        {
            list.ToList().ForEach(entity =>
            {
                this.Db.Set<TEntity>().Add(entity);
                this.Db.Entry(entity).State = System.Data.EntityState.Added;
            });
            this.SaveChanges();
        }
 
        public void Delete(TEntity entity)
        {
            this.Db.Set<TEntity>().Remove(entity);
            this.Db.Entry(entity).State = System.Data.EntityState.Deleted;
            this.SaveChanges();
        }
 
        public void Delete(IList<TEntity> list)
        {
            list.ToList().ForEach(entity =>
            {
                this.Db.Set<TEntity>().Remove(entity);
                this.Db.Entry(entity).State = System.Data.EntityState.Deleted;
            });
            this.SaveChanges();
        }
 
        public System.Data.Entity.IDbSet<TEntity> GetList()
        {
            return this.Db.Set<TEntity>();
        }
 
        public TEntity GetEntityById(TEntity entity)
        {
 
            return this.Db.Set<TEntity>().Find(entity.Id);
        }
 
        public void Update(TEntity entity)
        {
            var entry = this.Db.Entry(entity);//从DbContext类型的对象
            if (entry.State == EntityState.Detached)
            {
                var entityToUpdate = this.Db.Set<TEntity>().Find(entity.Id);

EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<TEntity,

TEntity>().Map(entity, entityToUpdate);

                this.SaveChanges();
            }
        }
 
        public void Update(IList<TEntity> list)
        {
            list.ToList().ForEach(entity =>
            {
                var entry = this.Db.Entry(entity);
                if (entry.State == EntityState.Detached)
                {
                    var entityToUpdate = this.Db.Set<TEntity>().Find(entity.Id);
                    EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<TEntity, 
                    TEntity>().Map(entity, entityToUpdate);
                    this.SaveChanges();
                }
            });
        }
 
        #endregion
 
        /// <summary>
        /// 操作提交
        /// </summary>
        public override void SaveChanges()
        {
            base.SaveChanges();
        }
    }
 
}

当然,对于一个特殊的操作逻辑,我们要进行特殊的处理,如可以单独建立用户操作接口,产品操作接口等,而对于逻辑简单的模块,使用上面通过方法足以。

Entity实体层,我没有进行刻意的再封装,因为EF4.1帮助我们生成的代码已经基本满足了要求,它不向LINQ TO SQL 把操作与类实体混在一起,它是分开的。对于通用的更新操作,我们还需要人为干预一下Entity的实体类,如下:

IEntity通用接口会提供一个属于让继承它的实体类去实现,这个属性就是表主键,用来唯一确定一个实体。

namespace Entity
{
    /// <summary>
    /// 实体模块统一接口
    /// </summary>
    public interface IEntity
    {
        /// <summary>
        /// 为了主键统一,而手动设置的
        /// TODO:这是为了泛型的统一操作而设计的,非常经典 
        /// </summary>
        string Id { get; }
    }
}
而Menu这个实体会这样描述它:
 
namespace Entity.Entities
{
    public class Menu:Entity.IEntity
    {
        public Menu()
        {
            this.Role_Menus = new List<Role_Menus>();
        }
 
        public int MenuID { get; set; }
        public string URL { get; set; }
        public int ParentID { get; set; }
        public string MenuName { get; set; }
        public System.DateTime CreateDate { get; set; }
        public System.DateTime UpdateDate { get; set; }
        public int Status { get; set; }
        public int SortNum { get; set; }
        public string Operator { get; set; }
        public int Type { get; set; }
        public virtual ICollection<Role_Menus> Role_Menus { get; set; }
 
        #region IEntity 成员
 
        public string Id
        {
            get { return this.MenuID.ToString(); }
        }
 
        #endregion
    }
}

实事上,Entity层是一个共享层,它可以同时被Data,Service和WebUI层访问,Service层用来与Data层直接进行交互。

它定义了User模块的逻辑实现接口,它的实现逻辑可以由多个类进行实现,这里面我们可以使用IOC以降低类的耦合度。如何实现IOC(控制反转)可以看我的这篇文章

由于篇幅较大,所以只给出接口代码:

namespace Service
{
    public interface IUserService
    {
        List<Entity.Entities.UserBas> GetUserBases();
        Entity.Entities.UserBas GetUserBaseById(string id);
        void AddUserBase(Entity.Entities.UserBas entity);
        void ModifyUserBase(Entity.Entities.UserBas entity);
        void DeleteUserBase(Entity.Entities.UserBas entity);
        void DeleteUserBase(List<Entity.Entities.UserBas> entity);
    }
}

WebUI层将会涉及到我们讲的ASP.NET MVC 和 JQuery

实事上,MVC是WebUI层的一种架构方式,它可以表代码与页面逻辑分离开,表码层控制与它下一层的信息交互,而页面表现层只负责输出HTML代码及JS效果。

我们看到图中还有一个Models,它就可以MVC中的M,它叫做视图模型,我理解为,它是与页面相关的,为页面提供数据的类实体,比如,为用户中心(包括登陆,注册,修改密码等等)提供显示及验证逻辑等功能的都写在LogOnModels这个类里,这样在修改显示信息时,直接去这个类里修改就可以了。

JQuery它是JS的一种功能强大的类库,当你建立一个MVC项目时,它会被自动添加进来,(看来微软也开源了,:P),它可以实现页面的扩展效果,如动态的列表,菜单,验证机制等等。

我们可以看到VS2010自代的版本是1.4.1,是目前较新版本,而-vsdoc.js是一个jquery代码智能提供的工具,有了jquery我们在写js脚本时就方便多了,看这是一个ajax请求的例子:

   function list(id) {
        $("#cateid").val(id);
        clickHoverColor();
        $.ajax({
            type: "POST",
            url: "/down/List",
            data: { cateid: id },
            success: function(data) {
                $("#list").html(data);
            }
        });

是不是很清晰,很方便呢!如果想了解更多的js知识,可以看这篇文章

今天就写到这吧!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:中大型系统架构组合之EF4.1+ASP.NET MVC+JQuery,如需转载请自行联系原博主。

时间: 2024-12-29 18:01:44

中大型系统架构组合之EF4.1+ASP.NET MVC+JQuery的相关文章

SQL Serve 2005中的系统架构

架构 SQL Serve 2005中的系统架构SQL Server 2000中查询系统元数据的时候我们要通过很多系统表,例如sysobjects什么的,当然SQL Server中有很多系统存储过程,但是还是不能完全满足我们管理员的需求,所以只能查这些系统表,在SQL Server 2005中所有的系统表都被整合到了一个叫做sys的架构下,同时还有就是架构. 以下给一段范例代码,可以帮助大家在SQL Server 2005中查询出有哪些表引用了某张表, ----------------------

System.Web.Abstractions中的装饰者模式,及其在Asp.net Mvc中的应用

Wrapper模式的实现 作为.net framework 3.5 sp1 新添加的一个程序集,System.Web.Abstractions里所有的类,都是Wrapper/Decorator模式的.(System.Web.Abstractions里的类可以参见后面的附录,System.Web.Abstractions其实也早早出现在了Asp.net Mvc中)   在这里,所有的Wrapper类都是继承于Base类的(例如HttpApplicationStateWraper与HttpAppli

中大型网站架构演变之路

前言 网上有很多文章类似于我今天要分享的课程,有架构师写的,有运维写的,还有开发些的,偏重点都不同,今天我以咱们运维角度全面讲解. 一个成熟的网站架构并不是一开始设计就具备高可用.高伸缩.高性能等特性的,它是随着用户量和业务线不断增加,基础架构才逐渐健壮的.在发展初期,一般都是从0到1,不会一上来就整一些大而全的架构,也很少人这么任性. 说明 适用业务:电商/门户/招聘网站 开发语言:PHP和JAVA Web服务:Nginx/Tomcat8 数据库:MySQL 操作系统:CentOS 物理服务器

系统架构的一些参考资料

最近看到在一些论坛上看到一些人问系统架构看那些资料的问题,估计做了一定时间的开发人员,都会遇到这个问题,根据 这几年出版的资料和自己看的一些内容,初步整理一下,以飨读者. 理论基础篇 架构实战-软件架构设计的过程:理论性较强 http://product.china-pub.com/196666 架构之美--软件架构的艺术: 来自于西门子架构部门的两位作者的鼎力之作,理论性好 http://product.china-pub.com/195142 实践篇 以下两个是国内的这方面的专家温昱的作品,

性能测试知多少---系统架构分析

有些事儿一旦放一放就难再拾起来,突然发现<性能测试知多少>这个系列两月没更新,关键时我都不知道啥时候放下的,总容易被各种技术所吸引走,如饥似渴的想学更多的东西,这几天一直有朋友问我为啥不写了,我才意识,事情要一样一样做,我现在要把这个系列完成.   之前有对性能需求进行过分析,那篇主要从项目业务.背景等角度如何抽丝剥茧的将项目的需求抽离出来.在我们进行需求的时候也需要对被测项目的架构有一定的认识,如果不了解被测系统的架构,那么在后期的性能分析与调优阶段将无从下手.   简单系统架构介绍    

ASP.NET MVC中你必须知道的13个扩展点

ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点.Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在 以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助. ASP.NET MVC设计

ASP.NET MVC以ValueProvider为核心的值提供系统: NameValueCollectionValueProvider

在进行Model绑定过程中,需要根据基于Action方法参数的绑定上下文从请求数据中提取相应的数据以提供相应的数据.具体来说,Model绑定的数据具有多个来源,可能来源于Post的表单或者JSON字符串,或者来源于当前的路由数据,也可能来源于请求地址的插叙字符串.ASP.NET MVC将这种基于不同数据来源的数据获取/提供机制实现在一个叫做ValueProvider的组件中.[本文已经同步到<How ASP.NET MVC Works?>中] 目录 一.IValueProvider与Value

ASP.NET MVC 3实现访问统计系统_实用技巧

运营网站,我们经常需要分析用户的行为.用户的习惯,用户看重网站的哪一部分,哪一部分是对用户有用的之类的信息,这些信息从哪里来,这时我们就需要用到访问统计系统了. 网上已经有很多的统计系统,如站长统计.百度统计.谷歌分析之类的,别人的东西始终是别人的,为什么我们不自己实现统计的功能呢,而且自己写的可以实现一些特殊的功能,如登录,下单行为,能够更好的融合自己的系统! 下面我们就用ASP.NET MVC 3来实现一个访问统计系统!首先,使用程序生成一段js代码,包括读写Cookie,及写入一个唯一值到

【初学者指南】在ASP.NET MVC 5中创建GridView

介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些库能够提供所有必需的功能,如 Web 表格中的搜索.排序和分页等.是否包含这些功能,取决于应用的特殊需求,例如在客户端和服务器端提供搜索或其它功能的需求等. 可用的库 以下是一些可用的库和插件: Grid.Mvc MVCGrid.NET PagedList.MVC JQuery.Grid JQuer