前言:

最近园子里ABP炒的火热。看了几篇对于ABP的介绍后,深感其设计精巧,实现优雅。个人感觉,ABP或ABP衍生品的架构设计,未来会成为中型Net项目的首选架构模式。如果您还不了解ABP是什么,有什么特色,请移步:《ABP集合帖》——http://www.cnblogs.com/kebinet/p/5341663.html


项目背景介绍:

  作者自参加工作以来,一直在法律圈打转。09-12年间,作者曾带团队用WebForm+N层架构实现了一个律师事务所的OA系统。时过境迁,现在在维护此系统时,发现了当初很多设计不合理的地方。所以本项目延续原OA系统的设计思路,以ABP为基础架构,进行彻底重构。

  注意:本系列文章定位为开发笔记,不代表ABP的最佳实践。

一、ABP是什么,ABP.Zero又是什么?从哪里下载ABP项目模板?

  ABP全称为:“ASP.NET Boilerplate Project (ASP.NET样板项目)”。顾名思义,ABP实质上是一个.Net开发的分层示例+各种开发辅助类库。ABP是一个以DDD设计模式为原则的Net项目分层示例+一大堆作者写的辅助类库。

  ABP.Zero则是ABP的作者配合ABP框架写的一套用户模块。其本质是对ASP.NET Identity的二次封装。

  ABP.Zero是一个独立模块。可用可不用。如果您的程序中,用户模块非常独特,建议您不要使用ABP.Zero模块,而是独立实现一套用户系统。在我们的示例项目中,用户模块也是非常独特的,作者会尽可能尝试用ABP.Zero去解决,如果实在无法适用,那么我们将做一套独立的用户模块去替代。

  • ABP作者官网:http://www.aspnetboilerplate.com/
  • GitHub地址:  https://github.com/aspnetboilerplate/

(请默默感谢这两位主要维护人员。如此优秀的开源项目,值得32个赞)

如图所示,登录官网首页后,即可以下载ABP项目模板。这里,我们选择了使用.net framework4.5.2+mvc5的多页面实现。ORM我们选择了EntityFramework,并且选择使用ABP.Zero模块。(此处也可不选,日后需要时再安装)。注意最底部的【EasyFast】,此处是你的解决方案名称。下载并解压后,我们得到了如下文件:

我们将解决方案名称换成了中文【易迅律师事务所OA系统】。(作者手里有多份OA实现,为了防止歧义,才换了中文名称,此处改不改不会对项目本身造成任何影响)

二、ABP使用前的基本设置

2.1、程序包的还原与更新(必须)

  我们下载回来的ABP不包含对应packages(例如Newtonsoft.Json、EntityFramework、Log4net等等)。所以在使用前,请先在解决方案上右键,然后选【还原NuGet包】,等全部包下载完成后,再在解决方案上右键,选择【管理解决方案的NuGet程序包】,看看是否有更新,如果有,请同步更新。

请注意:上图所示的包无法更新,会提示有冲突,请忽略,不用更新此包。

2.2、修改数据库连接字符串(非必须)

  解决完包的问题后,我们来修改下数据库连接字符串ABP默认的数据库连接字符串名字叫【Default】。嗯,不够高大上,另此字符串的部分参数也不够合适,我们同步修改。此步骤一共需要修改三个文件:

  1. EasyFast.Web =>Web.config。——修改数据库连接字符串。name改为【AppDbContext】,内容改为用户名+密码连接方式
  2. EasyFast.EntityFramework=>EasyFastDataModule.cs 。——修改为:Configuration.DefaultNameOrConnectionString = "AppDbContext";
  3. EasyFast.EntityFramework.EntityFramework=>EasyFastDbContext.cs。——修改为:public EasyFastDbContext() : base("AppDbContext")

web.config修改前:

  <connectionStrings>
<add name="Default" connectionString="Server=localhost; Database=EasyFast; Trusted_Connection=True;" providerName="System.Data.SqlClient" />
</connectionStrings>

web.config修改后:

<connectionStrings>
<add name="AppDbContext" connectionString="data source=(local);
initial catalog=oa.easyfast.cn;
user id=sa;
password=info@123;
MultipleActiveResultSets=True;
App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

小知识——MultipleActiveResultSets=True & Trusted_Connection=True

  当在数据库连接字符串中指定MultipleActiveResultSets=True时。可以在一个连接上执行多次查询。这样可大大减轻数据库压力,提高程序负载能力。强烈推荐开启。

  当在数据库连接字符串中指定Trusted_Connection=True时,意味着这是一个可信连接。不需要输入用户名密码就可以登录数据库。在正式的生产服务器上,不推荐这么做。(启用该属性,实质上是使用windows账户进行数据库连接。在生产服务器上,windows账户和SQLServer账户应该设置为不同的账户以降低安全风险)

2.3、修改程序命名空间(非必须)

  ABP默认使用了简化的命名空间。对于本项目来说,EasyFast.Application、EasyFast.Core、Easyfast.EntityFramework三个层统一使用了EasyFast作为命名空间。EasyFast.WebApi则使用了EasyFast.Api作为命名空间。对于Application、Core、EntityFramework三个层来说,随着项目越来越大,使用相同的命名空间容易引起歧义。所以我们做如下修改:

  • EasyFast.Application——命名空间修改为EasyFast.Application
  • EasyFast.Core——命名空间修改为EasyFast.Core
  • Easyfast.EntityFramework——命名空间修改为Easyfast.EntityFramework
  • EasyFast.Api——暂时保持不变

图示:在Application、Core、EntityFramework三个项目上右键,选择属性,将对应的默认命名空间分别修改为EasyFast.Application、EasyFast.Core、EasyFast.EntityFramework

  注意:修改命名空间后,需同步修改相应的代码引用。否则程序无法编译通过。请慎重考虑此处是否修改。

2.4、修改启动项目(必须)

  ABP的默认启动项目是Core层,这样每次调试时非常麻烦,我们将启动项目修改为【当前选定项】,这样我们在编辑完view页面时,直接按Ctrl+F5就可以直接查看效果。而不用每次都在页面上选择【使用浏览器查看】。修改方法:在解决方案上右键,选择属性,在新打开的窗口中将通用属性中的启动项目选项修改为【当前选定内容】

2.5、初始化数据库(必须)

ABP项目模板中,默认保留了大量model修改记录。在SQL2014环境下,初始化数据库可能会失败。解决办法:删除所有的model修改记录,重新初始化。请删除下图中数字开头的类文件。然后载程序包管理控制台执行【Add-Migration Init】、【Update-DataBase】。注意,在程序包管理控制台中,默认项目需选中EasyFast.EntityFramework。且在执行命令前,鼠标需先选中EasyFast.Web项目。

  在执行Add和Update两个命令时,程序需先连接至数据库以确定到底需要更新什么(需要建立、更新、删除哪些表)。但是,在EasyFast.EntityFramework项目中,没有数据库连接字符串。所以程序会卡死一段时间。

  解决办法1:在执行命令前,在【解决方案资源管理器】选中web项目(此项前提是上一步中,在解决方案属性中,将启动项目修改为【当前选中项目】)。如此操作,可以让VS知道通过web项目中web.config中的数据库连接字符串去连接数据库。

  解决办法2:EasyFast.EntityFramework层中,修改App.config文件,将Web项目中web.config中的连接字符串复制到【<configuration>】节点后。

三、本章节所使用的源码

  项目已开源,GitHub地址:https://github.com/easyfast/LawfirmOA

一、项目基础架构(附GitHub地址)——以ABP为基础架构的一个中等规模的OA开发日志的更多相关文章

  1. 二、处理MVC多级目录问题——以ABP为基础架构的一个中等规模的OA开发日志

    就个人感觉而言.ASP.NET MVC是一种非常反人类的设计.(我没有接触过Java的MVC,不知道两者是否一样.如果一样,那么搞Java的同学也挺可怜.)尤其是MVC的路由机制,灰常灰常反动.路由所 ...

  2. 一个简单的3DTouch、Peek和Pop手势Demo,附github地址

    参考文章:http://www.jianshu.com/p/74fe6cbc542b 下载链接:https://github.com/banchichen/3DTouch-PeekAndPopGest ...

  3. 如何将git本地创建的项目推送到github仓库

    除了集中式的版本控制系统CVS和SVN外,还有目前世界上最先进的分布式版本控制系统Git,它的创始人是创建了linux的大神 - linus.GitHub网站与2008年开始服役,为开源项目免费提供G ...

  4. 【分布式架构】--- 基于Redis组件的特性,实现一个分布式限流

    分布式---基于Redis进行接口IP限流 场景 为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即 ...

  5. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

  6. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括wap站点.手机app站点. 一.现有公司技术人员现状: 1.熟悉asp ...

  7. Android常用酷炫控件(开源项目)github地址汇总

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

  8. 国内互联网公司的开源项目及github地址汇总

    国内互联网公司的开源项目及github地址汇总 阿里 阿里的开源项目很多,这也跟@淘宝正明的开源态度密不可分.有很多重量级的项目,例如LVS.Tengine,或者很有实践价值的中间件,例如 MetaQ ...

  9. 一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)

    本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...

随机推荐

  1. ural 1208 Legendary Teams Contest

    题意描述:给定K支队伍,每队三个队员,不同队伍之间队员可能部分重复,输出这些队员同时能够组成多少完整的队伍: DFS,利用DFS深度优先搜索,如果该队所有队员都没有被访问过,那么将该队计入结果,再去选 ...

  2. Java中的移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  3. C# Enum 进行逻辑运算

    Enum定义 enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间內直接定义 enum,以便该命名空间中所有的类都能够同样方便地 ...

  4. 经典DOS游戏皇帝攻略(曾经的回忆)

    最完美攻略>>>>> -------------------------------------------------------------------------- ...

  5. XML操作类

        using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { ...

  6. Python的高级特性9:蹩脚的多态

    学习了java再来看python的多态,总感觉怪怪的,很蹩脚.. 1.python的父类根本不能调用子类的方法,只能蹩脚的依靠重写方法,然后在运行时去调用,实现伪多态... 2.所谓的鸭子类型看起来很 ...

  7. Java synchronized

    1. 将synchronized加在方法上, 即可实现对此方法的同步 public synchronized void deposit(float amt) { float tmp = amount; ...

  8. PAT 1015. 德才论 (25)

    宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子 ...

  9. .NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

  10. codevs2806 红与黑

    难度等级:白银 codevs2806 红与黑 题目描述 Description 有一个矩形房间,覆盖正方形瓷砖.每块瓷砖涂成了红色或黑色.一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一, ...