Asp.net MVC + EF + Spring.Net 项目实践(四)

这篇写一写如何使用Spring.net来解耦各个项目

1. 在接口层添加IStudentBLL文件,里面有GetStudent和GetAllStudents两个方法;然后在StudentBLL类里实现这两个方法。此外还要在StudentManageSystem.ViewModel层添加StudentViewModel。

注意,此处使用了属性StudentRepository,后期会用Spring.net将些属性注入

  

2. 添加单元测试工作,为BLL层写单元测试。此处引用了NSubstitute做为Mock工具,为BLL层隔离Repository层。具体的使用方法,可自行百度,此处不做解释。

  

3. 引用Spring.net里面的Spring.Core,为了能够实现注入,需要重新实现IControllerFactory接口,如下

public class SpringControllerFactory : IControllerFactory
    {
        /// <summary>
        /// Default ControllerFactory
        /// </summary>
        private static DefaultControllerFactory defalutf = null;

        public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
        {
            //get spring context
            //WebApplicationContext ctx = ContextRegistry.GetContext() as WebApplicationContext;

            var ctx = ContextRegistry.GetContext();

            string controller = controllerName + "Controller";
            //查找是否配置该Controller
            if (ctx.ContainsObject(controller))
            {
                object controllerf = ctx.GetObject(controller);
                return (IController)controllerf;

            }
            else
            {
                if (defalutf == null)
                {
                    defalutf = new DefaultControllerFactory();
                }

                return defalutf.CreateController(requestContext, controllerName);

            }

        }

        public void ReleaseController(IController controller)
        {
            //get spring context
            IApplicationContext ctx = ContextRegistry.GetContext();
            if (!ctx.ContainsObject(controller.GetType().Name))
            {
                if (defalutf == null)
                {
                    defalutf = new DefaultControllerFactory();
                }

                defalutf.ReleaseController(controller);
            }
        }

        public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
        {
            return SessionStateBehavior.Default;
        }
    }

在Global.cs的Application_Start方法中设置控制器工厂,如下

4. 在web.config中配置Spring.net文件

首先在configSections里加入节点<sectionGroup>,内容如下,这个节点必须是排在第一位的

然后在与configSections并列的层级添加spring context,可以使用外部文件(1),也可以使用内容节点(2)方式,我这里是把配置节点放到了App_Data里面了

objects文件内容如下

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
  <object id="HomeController" type="StudentManageSystem.Web.Controllers.HomeController, StudentManageSystem.Web" singleton="false">
    <property name="StudentBll" ref="studentBll"></property>
  </object>

  <object id="studentBll" type="StudentManageSystem.Business.StudentBLL, StudentManageSystem.Business" scope="request">
    <property name="StudentRepository" ref="studentRepository"/>
  </object>

  <!-- repository -->
  <object name="smsDbContext" type="StudentManageSystem.Repository.SMSContext,StudentManageSystem.Repository" scope="request">
    <constructor-arg name="connectionStringOrName" value="SMSContext">
    </constructor-arg>
  </object>
  <object id="repositoryBase" abstract="true" scope="request">
    <constructor-arg ref="smsDbContext"/>
  </object>
  <object name="studentRepository" type="StudentManageSystem.Repository.StudentRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/>
  <object name="scoreRepository" type="StudentManageSystem.Repository.ScoreRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/>
  <object name="gradeRepository" type="StudentManageSystem.Repository.GradeRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/>
  <object name="subjectRepository" type="StudentManageSystem.Repository.SubjectRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/>
</objects>

5. 在Web层Views/Home添加Student视图,然后在HomeController里添加对应的action。同样也加入StudentBll属性,为注入做准备

做好准备之后,F5运行,见证奇迹的时刻到了……

呵呵,报错了,看看什么原因?是spring没有找到StudentRepository类库,无法实例化。将StudentManageSystem.Repository项目的生成路径改到StudentManageSystem.Web/bin目录下,重新F5运行起来~~~

生成成功,StudentBll已经注入成功,并且能从数据库里取出内容,如下。

好了,就到这里吧,抛个砖,希望能引出玉来,哈哈~~~里面有些说明不清楚的地方请大家包涵,欢迎讨论。

代码下载地址:http://pan.baidu.com/s/1o6Lu6Fo

PS:硬广,本人正准备换工作,如果有亲需要MVC方面的人,可以联系我。

简介:8年以前.net BS开发经验,MVC4年+,WCF2年+,jQuery6年+;3年以上管理经验,带过10人左右的团队;对质量有较高的要求。地点:北京

联系方式:junior_ya@163.com,或者回复联系方式,我给您发简历,谢谢大家。

时间: 2024-08-28 20:16:03

Asp.net MVC + EF + Spring.Net 项目实践(四)的相关文章

Asp.net MVC + EF + Spring.Net 项目实践(目录)

用4篇博客来搭一个MVC的框架,可能对初学者会有一些帮助,大家共勉吧.我觉得对于中小型项目,这个框架可能还是有一定的用处的,希望能够帮助到一些人. Asp.net MVC + EF + Spring.Net 项目实践(一)添加项目结构 Asp.net MVC + EF + Spring.Net 项目实践(二)  通过数据库表生成Entity Asp.net MVC + EF + Spring.Net 项目实践(三)  调整Entity结构 Asp.net MVC + EF + Spring.Ne

ASP.NET MVC+EF框架+EasyUI实现权限管理系列

http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个 项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个 系列

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装 前言:今天经理买了一个诺基亚的Windows Phone 8系统,特感兴趣,所以在哪里看了很长时间,这篇文章就写的有点迟, 从这个Demo开始到现在我已经写了4篇博客了,终于可以看到页面的东

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程 前言:前面几篇博客我们基本已经介绍完了搭建整个项目和数据库访问层以及一些业务逻辑层的实现,当然了,我们的数据库访问层这样还是可以在进行封装的,但是我到这里就行了吧,项目也不大,不需要那么麻烦的,那么我们今天开始介绍我们需要介绍的内容,那就是我

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这个权限系统的初步设计-框架搭建,首先我要说的是我们需要开发工具Visual Studio 2012或者10也行,其次是我们要有SQL Server数据库,如果是Visual Studio 2010的话,你还要安装MVC4的开发文件,这个是吗?我不记得了,谁可以回答我一下的,我一直用2012,都是集成

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(6)- EF上下文实例管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装  (5):前台Jquery easyUI实现 前言:通过前面的五篇博客我们已经对权限系统的后台架构进行了详细的说明,那么我再前面的博客中也说到了我们的后台架构还会再改的,我准备这段时间我们继续完善我们的后台

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装  (5):前台Jquery easyUI实现   (6):EF上下文实例管理 前言:上篇博客中我们重新对EF框架实现上下文进行了重新的操作,而且我们也建立了DbSession,使用CallContext

记录我的ASP.NET MVC+EF的印记

首先我想大家对ASP.NET MVC+EF并不陌生,可悲的是小菜我从2012年知道他的存在直到现在才开始学习.可以说是浪费了很多时间,由于楼主一直使用ADO.NET+三层的模式,所以总觉得有自己的一番天地,同时在此呼吁还有像我一样的橙色猿或攻城师们请正视它,时代的脚步不会因为你们而停留.但最近一段时间可以说是2014年下半年,整个行情都是在使用ASP.NET MVC+EF或者其他持久层来搭建项目.大势所趋不得不正视它了. 楼主的MVC水平还停留在2.0的水平,可想而知.当时是出于项目需要而使用了

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装  (5):前台Jquery easyUI实现   (6):EF上下文实例管理   (7):DBSession的封装   (8):DBSession线程内唯一 前言:前面我们基本已经完成了一个Demo,我们在后面的