你的位置:首页 > ASP.net教程

[ASP.net教程]搭建一套自己实用的.net架构【Web


之前介绍过【ORM-Dapper+DapperExtensions】这篇文章,也有好多朋友问我后台应用的实现方法,其实细心的朋友如果用代码生成器生成一个表的代码,其实就明白了。

不过还是要在此蛋逼一番,就当为祖国的未来苦逼初级程序员做贡献了,只希望别误人子弟就好。(高手们点完推荐,就可以跳过了)

      公司刚来了个实习生,Boss让我没事干多带带他,大学没搞过.net,现在重新学起,刚来的时候天天抱着一本《21天学通ASP.NET》,看到这书的名字我也是醉了,

丫的21天就学通,我有种保证不打死作者的冲动。翻看了下书,毕竟都是基础知识嘛,初学者还是必须掌握的,不过要是看完书就能做个项目。 我只能 "呵呵……". 

我给他圈了几章重点(一些直接拖拉控件的内容就暂且忽略掉了,公司用mvc做项目学这个浪费时间),教他搭建简单三层,给他出了个题目

采用mvc 使用三层做个增删改查(小伙还在迷茫中)。  其实我认为编程最重要的就是一个思想,只要有思路并加以实践,都会有收获的

      言归正传,我介绍的这个后台的实现并非是大家参考的典范,你可以写你心中的代码,其实最终的目的都是能够完成功能。

还有就是根据不同的系统以及不同的需求而采用不同的架构才是王道。比如架构设计的很牛掰,运用了各种重型框架,各种配置。最终实现的就是一个很小的系统。

站在公司的角度,其实属于过度设计了,项目做好后还会有维护、功能扩展之类的,开发人员总是在流动,那么新接手的人也是需要掌握这些技术才行,

这也间接的增加了维护成本。当然大多数领导都愿意找一个已经做好的系统拔过来改改就用,遇到这样的事就当我没说,对于大多数单位盈利才是重要的,

质量什么的要看技术经理的水平了。又扯远了……

      下图是我要介绍实现的项目截图:

其实也是三层,只是名字不一样而已。  

HY.Web( UI层,MVC)

HY.Web.Iservice( 服务接口层)

HY.Web.Service(服务层,HY.Web.Iservice的实现类,    你也可以理解为业务逻辑层BLL)

HY.Web.DAO(数据访问层,   你也可以理解为DAL)

HY.Web.Entity(实体层,  目前只定义了数据实体, 如果你的系统需要给app提供数据, 那么传输的数据要精简,就需要单独定义DTO了。   )

 

就那用户表来做个实例吧,表结构如下:(下图是用代码生成器截图效果,可以直接修改数据库的描述信息,开发利器。需要的朋友点这里【CodeBuilder-RazorEngine】)

////Created: 2014-11-13 01:42:34//Author: 代码生成//using System;using System.Collections.Generic;using System.Linq;using System.Text;using DapperExtensions.Mapper;namespace HY.Web.Entity{  /// <summary>  /// Sys_Users:实体对象  /// </summary>  [Serializable]  public class Sys_UsersEntity  {    ///<summary>    ///    ///</summary>    public string ID { get; set; }    ///<summary>    ///    ///</summary>    public string Name{ get; set;}    ///<summary>    ///    ///</summary>    public string LoginName{ get; set;}    ///<summary>    ///    ///</summary>    public string Password{ get; set;}    ///<summary>    ///    ///</summary>    public string Mobile{ get; set;}    ///<summary>    ///    ///</summary>    public string Email{ get; set;}    ///<summary>    ///    ///</summary>    public string Address{ get; set;}    ///<summary>    ///0:冻结;1:激活    ///</summary>    public int? Status{ get; set;}    ///<summary>    ///    ///</summary>    public DateTime? CreateTime{ get; set;}    ///<summary>    ///    ///</summary>    public DateTime? LastUpdateTime{ get; set;}    /// <summary>    /// 主题    /// </summary>    public string ThemeName { get; set; }  }  /// <summary>  /// Sys_Users:实体对象映射关系  /// </summary>  [Serializable]  public class Sys_UsersEntityORMMapper : ClassMapper<Sys_UsersEntity>  {    public Sys_UsersEntityORMMapper()    {      base.Table("Sys_Users");      //Map(f => f.Status).Key(KeyType.Assigned);      //Map(f => f.UserID).Ignore();      AutoMap();    }  }}

View Code

 

HY.Web.DAO 

定义基类 BaseRepository.cs (可以设置默认的DBsession,方便扩展其它东东)

using System;using HY.DataAccess;using HY.Freamework;using HY.ORM;using HY.Web.Entity;namespace HY.Web.DAO{  public abstract class BaseRepository : RepositoryBase, IDisposable  {    protected BaseRepository()    {      SetDBSession(Helper.CreateDBSession(CommonConfig.DefaultDbType, CommonConfig.DefaultConnKey));    }    protected BaseRepository(IDBSession dbSession)      : base(dbSession)    {    }    public void Dispose()    {    }  }}

View Code

 

定义数据访问层 Sys_UsersRepository.cs (代码里可以封装任何需要写sql 的代码)

////Created: 2014-11-12 04:29:09//Author: 代码生成//using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.Common;using HY.Web.Entity;using HY.Freamework;using HY.ORM;using HY.DataAccess;using DapperExtensions;namespace HY.Web.DAO{  /// <summary>  /// Sys_Users:数据访问对象  /// </summary>  public class Sys_UsersRepository : BaseRepository  {    public static readonly Sys_UsersRepository Instance = new Sys_UsersRepository();    private Sys_UsersRepository()    {    }    public Sys_UsersRepository(IDBSession dbSession)      : base(dbSession)    {    }    /// <summary>    /// 演示代码用    /// </summary>    /// <param name="roleID"></param>    /// <returns></returns>    public IEnumerable<Sys_UsersEntity> GetUserByID(string userID)     {      string sql = @"SELECT * FROM Sys_Users AS su WHERE su.Id=su.Id = @UserID ";      return this.Get<Sys_ButtonsEntity>(sql, new { UserID = userID });    }  }}

View Code

 

HY.Web.IService

定义接口 ISys_UsersService.cs ,提供给UI访问。

////Created: 2014-11-12 04:29:09//Author: 代码生成//using System;using System.Collections.Generic;using System.Linq;using System.Text;using HY.Web.Entity;using HY.ORM;namespace HY.Web.IService{  /// <summary>  /// Sys_Users:服务访问对象接口  /// </summary>  public interface ISys_UsersService : IDataServiceRepository  {    /// <summary>    /// 获得当前用户    /// </summary>    /// <returns></returns>    LoginInfo GetCurrentUser();    bool Login(string userName, string password);  }}

View Code

 

HY.Web.Service

定义BaseService.cs,(可以设置默认的DBsession,方便扩展其它东东)

using System;using System.Collections.Generic;using HY.DataAccess;using HY.Freamework;using HY.ORM;using HY.Web.Entity;namespace HY.Web.Service{  public abstract class ServiceBase : RepositoryServiceBase, IDisposable  {    public IList<IDisposable> DisposableObjects { get; private set; }    public ServiceBase()          {      SetDBSession(Helper.CreateDBSession(CommonConfig.DefaultDbType, CommonConfig.DefaultConnKey));      DisposableObjects = new List<IDisposable>();    }    public ServiceBase(IDBSession dbSession)      : base(dbSession)    {            DisposableObjects = new List<IDisposable>();    }    protected void AddDisposableObject(object obj)    {      IDisposable disposable = obj as IDisposable;      if (null != disposable)      {        DisposableObjects.Add(disposable);      }    }    public void Dispose()    {      foreach (IDisposable obj in DisposableObjects)      {        if (null != obj)        {          obj.Dispose();        }      }    }  }}

View Code

 

定义Sys_UsersService.cs, 去实现ISys_UsersService。

////Created: 2014-11-12 04:29:09//Author: 代码生成//using System;using System.Collections.Generic;using System.Linq;using System.Text;using HY.Web.IService;using HY.Web.Entity;using HY.Web.DAO;using HY.Freamework;using HY.ORM;using DapperExtensions;using System.Web;using System.Web.Security;using HY.Utilities;using HY.DataAccess;namespace HY.Web.Service{  /// <summary>  /// Sys_Users:服务访问对象  /// </summary>  public class Sys_UsersService : ServiceBase, ISys_UsersService, IDisposable  {    public Sys_UsersService()    {    }    public Sys_UsersService(IDBSession dbSession)      : base(dbSession)    {    }    public LoginInfo GetCurrentUser()    {      return CurrentUser;    }    /// <summary>    /// 用户登录信息    /// </summary>    public static LoginInfo CurrentUser    {      get      {        if (HttpContext.Current.Session["LoginInfo"] == null)        {          LoginInfo login = new LoginInfo();          login.ThemeName = "default";          login.IsAdmin = false;          if (HttpContext.Current.User.Identity.IsAuthenticated)          {            try            {              FormsIdentity identity = (FormsIdentity)System.Web.HttpContext.Current.User.Identity;              FormsAuthenticationTicket ticket1 = identity.Ticket;              string encryptUserData = ticket1.UserData;              string userData = DEncrypt.Decrypt(encryptUserData, ticket1.Name);              login = JsonHelper.FromJson<LoginInfo>(userData);              Sys_RolesEntity roleEntity = new Sys_RolesService().GetById<Sys_RolesEntity>(login.RoleID);              if (roleEntity != null && roleEntity.RoleType == 0)              {                login.IsAdmin = true;              }              login.ThemeName = "default";  //默认皮肤:default   黑色:black       流行灰:gray                 login.LeftMenu = new Sys_MenuService().GetMenuByRoleID(login.RoleID, login.IsAdmin);              //login.MenuList = new Sys_MenuService().GetMenuListByRoleID(login.RoleID, login.IsAdmin);              login.MenuButtonList = new Sys_MenuButtonsService().GetMenuButtonsByRoleID(login.RoleID, login.IsAdmin);              login.ActionList = new Sys_MenuBtnActionsService().GetActionByRoleID(login.RoleID, login.IsAdmin);              login.ActionList.Add("SYS/HOME/INDEX");              login.ActionList.Add("SYS/HOME/WELCOME");              HttpContext.Current.Session["LoginInfo"] = login;            }            catch (Exception)            {              FormsAuthentication.SignOut();              throw;            }          }          else          {            login.UserID = "-1";          }          return login;        }        else        {          return (LoginInfo)HttpContext.Current.Session["LoginInfo"];        }      }    }    /// <summary>    /// 登录    /// </summary>    /// <param name="userName"></param>    /// <param name="password"></param>    /// <returns></returns>    public bool Login(string userName, string password)    {      bool result = false;      Sys_UsersEntity userEntity = this.GetList<Sys_UsersEntity>(new { LoginName = userName }).FirstOrDefault();      if (userEntity != null)      {        Sys_UserRolesEntity userRolesEntity = this.GetList<Sys_UserRolesEntity>(new { UserId = userEntity.ID }).FirstOrDefault();        if (userRolesEntity != null && userEntity.Password == FormsAuthentication.HashPasswordForStoringInConfigFile(password, "md5"))        {          LoginInfo login = new LoginInfo();          login.UserID = userEntity.ID;          login.RoleID = userRolesEntity.RoleID;          login.LoginName = userEntity.LoginName;          FormsAuthentication.SignOut();          string userData = JsonHelper.ToJson(login);          string encryptUserData = DEncrypt.Encrypt(userData, login.UserID);          FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, login.UserID, DateTime.Now,          DateTime.Now.AddHours(8), false, encryptUserData);          string hashTicket = FormsAuthentication.Encrypt(ticket);          HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);          HttpContext.Current.Response.Cookies.Add(userCookie);          result = true;        }      }      return result;    }  }}

View Code

 

HY.Web

1、定义相关的Controller

2、ISys_UsersService iSys_UsersService = new Sys_UsersService();  (这块其实可以使用 IoC, 相关内容且听后续分解)

3、调用接口

    /// <summary>    /// 登录验证    /// </summary>    /// <param name="model"></param>    /// <param name="returnUrl"></param>    /// <returns></returns>    [AllowAnonymous]    [HttpPost]    public ActionResult Login(LoginModel model, string returnUrl)    {      string validateCode = Session["__validatecodeimage"] == null ? "" : Session["__validatecodeimage"].ToString();      if (!string.IsNullOrEmpty(validateCode) && !string.IsNullOrEmpty(model.ValidateCode) && model.ValidateCode.Equals(validateCode))      {        if (iSys_UsersService.Login(model.LoginUserName, model.LoginPassword))        {          return RedirectToAction("Index", "Home");        }        else        {          model.Message = "用户名或密码错误";        }      }      else      {        model.Message = "验证码错误";      }      return View(model);    }

View Code

 

 

好了,大致就这点内容,也只是大致的引个思路。  项目实现过程中  丰俭由人……

 

 

 

搭建一套自己实用的.net架构(1)【概述】

搭建一套自己实用的.net架构(2)【日志模块-log4net】

搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】

搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

搭建一套自己实用的.net架构(5)【Web-后台实现】