简述
本文转自http://yuangang.cnblogs.com并加以整理。 本文用到了Spring的IOC和DI、接口的使用、实现
索引
项目开始
一、IOC和DI
- Ioc:Inversion of Control,即“控制反转”,是一种设计思想。
- 传统的设计思想是在对象内部直接控制,而IOC是将设计好的对象交给容器控制。
打个比方:我们租房子,在我们和房主之间插入了一个中间人(房介),我们只需要跟房介提出我们的要求,比如房子要三室一厅、卧室向阳、房东是女的等,房介就会按照我们的要求提供房产信息。我们满意就入住,如果我们不满意(抛出异常),房介就会帮我们做后续处理。整个过程不再是由我们控制,而是由房介这么一个容器去控制。所有的类都会在spring容器中登记,告诉spring你是谁,你需要什么,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
- DI: IOC的一个重点是在系统运行中,动态地向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? 有一个重要特征是反射reflection,它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。
二、用户管理的接口和实现
首先在Service类库下面创建两个文件夹 IService(存放接口)、ServiceImp(实现类),并且在这两个文件夹下面再分别建两个文件夹ComManage和SysManage,用于区分管理我们的接口和实现类。
我们创建系统管理用户SYS_USER的接口:右击IService/SysManage→添加→新建项→接口,IUserManage.cs。SysManage只是我们为了区分管理我们的接口文件,我们修改一下命名空间,让他们统一在Service.IService空间下,并且继承基础数据操作接口IRepository。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25namespace Service.IService
{
public interface IUserManage : IRepository<Domain.SYS_USER>
{
/// <summary>
/// 管理用户登录验证,并返回用户信息与权限集合
/// </summary>
/// <param name="username">用户账号</param>
/// <param name="password">用户密码</param>
/// <returns></returns>
Domain.SYS_USER UserLogin(string useraccount, string password);
/// <summary>
/// 是否超级管理员
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns></returns>
bool IsAdmin(int userId);
/// <summary>
/// 根据用户ID获取用户名,不存在返回空
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns></returns>
string GetUserName(int userId);
}
}创建用户接口的实现类:右击ServiceImp/SysManage→添加→类UserManage.cs。同样,我们修改一下命名空间,让他们统一在Service.ServiceImp空间下,并且继承基础数据操作类RepositoryBase和他的接口IUserManage.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51using Service.IService;
using System.Linq;
namespace Service.ServiceImp
{
public class UserManage : RepositoryBase<Domain.SYS_USER>, IUserManage
{
/// <summary>
/// 管理用户登录验证
/// </summary>
/// <param name="userAccount">用户名</param>
/// <param name="password">加密密码(AES)</param>
/// <returns></returns>
public Domain.SYS_USER UserLogin(string userAccount, string password)
{
var entity = this.Get(p => p.ACCOUNT == userAccount);
//因为我们用的是AES的动态加密算法,也就是没有统一的密钥,那么两次同样字符串的加密结果是不一样的,所以这里要通过解密来匹配
//而不能通过再次加密输入的密码来匹配
if (entity != null && new Common.CryptHelper.AESCrypt().Decrypt(entity.PASSWORD) == password)
{
return entity;
}
return null;
}
/// <summary>
/// 是否超级管理员
/// </summary>
public bool IsAdmin(int userId)
{
//这里我们还没有做用户角色 所以先返回个True,后面我们做角色的时候再回来修改
return true;
}
/// <summary>
/// 根据用户ID获取用户名
/// </summary>
/// <param name="Id">用户ID</param>
/// <returns></returns>
public string GetUserName(int Id)
{
var query = this.LoadAll(c => c.ID == Id);
if (query == null || !query.Any())
{
return "";
}
return query.First().NAME;
}
}
}
三、添加引用并配置spring启动
- 在Webpage项目中使用nuget添加spring.web.mvc5,会在项目引用中添加Spring.Core, Spring.Web, Spring.Web.Mvc5, Common.Logging, Common.Logging.Core
- 修改Global.asax的MvcApplication类继承于Spring.Web.Mvc.SpringMvcApplication
四、Spring配置
在Service类库下面新建一个文件夹Config用于存放注入文件,在Config文件夹下面新建两个XML文件ComService.xml和Service.xml
我们把这两个文件属性的生成操作修改为嵌入的资源:分别右击这两个XML文件→属性→生成操作→嵌入的资源。这样在编译生成时会把文件放在bin目录中。
移步操作WebPage,新建文件夹Config,新建3个XML文件并更改文件属性的生成操作修改为嵌入的资源(同上):
- ComControllers.xml:后台管理Com控制器
- Controllers.xml:后台管理Sys控制器
IndexControllers.xml:网站前台控制器
note1: 如果忘记潜入资源,会报错:
note2: 注意以上xml文件至少写上
1
2
3<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
</objects>如果只有
<?xml version="1.0" encoding="utf-8" ?>
可能报错:
修改一下WebPage的Web.Config,声明一下Spring容器和配置指向,注意他们的位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<sectionGroup name="spring">
<!--Spring声明容器-->
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc5" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<!--Spring配置指向-->
<spring>
<context>
<!--WebPage-->
<resource uri="assembly://WebPage/WebPage.Config/IndexControllers.xml" />
<resource uri="assembly://WebPage/WebPage.Config/Controllers.xml" />
<resource uri="assembly://WebPage/WebPage.Config/ComControllers.xml" />
<!--Service-->
<resource uri="assembly://Service/Service.Config/Service.xml" />
<resource uri="assembly://Service/Service.Config/ComService.xml" />
</context>
</spring>
<!--Spring配置指向 end-->
五、Spring容器的配置注入
Service类库Config/service.xml: 因为我们创建的用户表是管理员表,所以把这个配置放到Service.xml里
1 | <?xml version="1.0" encoding="utf-8" ?> |