我们都知道Asp.net MVC自有一套执行机制。
通过分析MVC的MvcHandler关键代码
ProcessRequest

        protected internal virtual void ProcessRequest(HttpContextBase httpContext) {
            AddVersionHeader(httpContext);

// Get the controller type
            string controllerName = RequestContext.RouteData.GetRequiredString("controller");

// Instantiate the controller and call Execute
            IControllerFactory factory = ControllerBuilder.GetControllerFactory();
            IController controller = factory.CreateController(RequestContext, controllerName);
            if (controller == null) {
                throw new InvalidOperationException(
                    String.Format(
                        CultureInfo.CurrentUICulture,
                        MvcResources.ControllerBuilder_FactoryReturnedNull,
                        factory.GetType(),
                        controllerName));
            }
            try {
                controller.Execute(RequestContext);
            }
            finally {
                factory.ReleaseController(controller);
            }
        }

我们可以认为MVC中Controller都是基于工厂模式来创建对象的。
但是要利用Spring.net实现IOC和AOP,就必须管理这个框架中具体对象的创建工作。
即通过配置文件的方式决定一个具体对象的生或死!
Objects

<objects xmlns="http://www.springframework.net/">
  
  <object id="Demos.Domain.Object">
    <property name="Target">
      <object type="Demos.Domain.Object,Demos.Domain">
        <property name="Manager" ref="Demos.Domain.Manager"/>
      </object>
    </property>
  </object>
</objects>

但是MVC框架自己的运行机制决定了Controller的创建不会经过Spring。
幸好,MVC留下了一个叫做SetControllerFactory的扩展。
即,程序运行之初我们就可以用自己的ControllerFactory替换默认的ControllerFactory.

protected void Application_Start()
        {
            //用自定义的构造工厂替换默认的
            ControllerBuilder.Current.SetControllerFactory(typeof(Demo.Core.ControllerFactory));

RegisterRoutes(RouteTable.Routes);
        }

这样我们自己的工厂进行替换默认的Controller工厂后,就可以控制Controller的创建了。

我们自己的Controller工厂的代码

ControllerFactory

using System.Web.Mvc;
using System.Web.Routing;
using Spring.Context;

namespace Demo.Core
{
    public class ControllerFactory : IControllerFactory
    {
        /// <summary>
        /// Default ControllerFactory
        /// </summary>
        private static DefaultControllerFactory defalutf = null;

public IController CreateController(RequestContext requestContext, string controllerName)
        {
            string controller = controllerName + "Controller";
            IApplicationContext ctx = Container.GetContext();

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)
        {
            IApplicationContext ctx = Container.GetContext();

if (!ctx.ContainsObject(controller.GetType().Name))
            {
                if (defalutf == null)
                {
                    defalutf = new DefaultControllerFactory();
                }

defalutf.ReleaseController(controller);
            }
        }
    }
}

Spring.net 容器包装的代码

Container

using System;
using System.Collections;
using System.Collections.Generic;
using Spring.Context;
using Spring.Context.Support;

namespace Demo.Core
{
    public class Container
    {
        /// <summary>
        /// 获取应用程序上下文.
        /// </summary>
        /// <returns><see cref="IApplicationContext"/>应用程序上下文.</returns>
        public static IApplicationContext GetContext()
        {
            if (FApplicationContext == null)
            {
                FApplicationContext = ContextRegistry.GetContext();
            }
            return FApplicationContext;
        }

/// <summary>
        /// 获取应用程序上下文.
        /// </summary>
        /// <param name="name"><see cref="IApplicationContext"/>应用程序上下文名称.</param>
        /// <returns><see cref="IApplicationContext"/>应用程序上下文.</returns>
        public static IApplicationContext GetContext(string name)
        {
            return ContextRegistry.GetContext(name);
        }

/// <summary>
        /// 获取对象.
        /// </summary>
        /// <typeparam name="T">对象的类型.</typeparam>
        /// <param name="id">标识.</param>
        /// <returns></returns>
        public static T GetObject<T>(string id)
        {
            return (T)GetContext().GetObject(id);
        }

/// <summary>
        /// 获取对象类表.
        /// </summary>
        /// <typeparam name="T">对象的类型.</typeparam>
        /// <returns></returns>
        public static IList<T> GetObjects<T>()
        {
            IEnumerable items = GetContext().GetObjectsOfType(typeof(T));
            IList<T> objects = new List<T>();
            foreach (DictionaryEntry item in items)
            {
                objects.Add((T)item.Value);
            }
            return objects;
        }

[ThreadStatic]
        private static IApplicationContext FApplicationContext;
    }
}

然后我们再新建个Demos.Controllers的项目。

using System.Web.Mvc;

namespace Demo.Controllers
{
    public class DemoController : Controller
    {
        public ViewResult Index()
        {
            ViewData["Message"] = "Welcome to IOC MVC";
            return View();
        }
    }
}

相应Dll的配置文件
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net/">
  <object id="DemoController" type="Demo.Controllers.DemoController, Demo.Controllers" singleton="false" >
  </object>
</objects>

并把配置文件设置为嵌入资源

然后再在Web.config中添加相应配置

Web.config

  <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web" />
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
  </sectionGroup>

<spring>
    <context>
      <resource uri="config://spring/objects" />
      <resource uri="assembly://Demo.Controllers/Demo.Controllers/Controllers.xml" />
    </context>
    <objects xmlns="http://www.springframework.net" />
  </spring>

测试运行,我们可以发现这个DemoController已在Spring的容器中。

转载于:https://www.cnblogs.com/moshe/archive/2010/02/07/1665344.html

ASP.NET MVC 整合 Spring.net(1)- Controller进容器相关推荐

  1. [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)

    继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory.Action Invoker 和异步 Controller 等内容. ...

  2. ASP.NET MVC vs Spring MVC

    C# 是微软出品对标 Java 的语言,在 web 开发方面,二者都在表现层实现了自己的 MVC 框架.从一个简单的项目开始对比,看看二者有何差异. 项目结构 首先来看由 SpringBoot 生成的 ...

  3. ASP.NET MVC 个人学习笔记之 Controller传值

    2019独角兽企业重金招聘Python工程师标准>>> //ControllerViewBag.Message = "Modify this template to jum ...

  4. Castle Team宣布Castle将与ASP.NET MVC整合

    MS宣布推出ASP.NET MVC Framework:http://www.cnblogs.com/Dah/archive/2007/10/08/916958.html 看了看上面的特性,概念几乎是 ...

  5. 【ASP.NET MVC 学习笔记】- 10 Controller和Action(1)

    本文参考:http://www.cnblogs.com/willick/p/3331521.html 1.继承IController接口,示例代码将当前请求的Controller和Action打印到浏 ...

  6. ASP.NET MVC Controller激活系统详解:默认实现

    Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前Cont ...

  7. Asp.net MVC 教程汇总

     自学MVC看这里--全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想 ...

  8. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程...

    简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.IO ...

  9. 一起谈.NET技术,ASP.NET MVC Membership 权限 漫谈

    以前一位同事习惯于使用Membership来进行权限管理,现在随着ASP.NET MVC的引入,采用以前的方法,提出了以下方案: ASP.NET MVC+Membership结合,通过在web.con ...

最新文章

  1. 附庸风雅(2006-10-20 13:39:32)(新浪)
  2. oracle重新恢复数据库,重新安装oracle根据原数据文件恢复数据库
  3. sublime-text-2相关快捷键
  4. flask-sqlalchemy分表解决方案
  5. 64位浮点数_C语言常见面试题解析(1)——浮点数的比较
  6. 用C#把文件转换为XML
  7. tempdb相关文章
  8. itunes备份包括哪些内容_软件开发项目技术方案包括哪些内容
  9. 九大Python处理PDF操作
  10. 电脑开机自动刷新阿里域名对于IP DDNS
  11. android简繁体切换快捷键,我的Android进阶之旅------Android中如何高效率的进行简繁体转换...
  12. vue-oss阿里云上传图片
  13. 实验一. 路由器IP地址配置及直连网络
  14. Java工程师成神之路~(2018修订版)
  15. java 爬虫 微博_最新新浪微博爬虫程序Java版 2015
  16. 《岛》让伤口暴露在空气里吧
  17. 简单聊聊MD5和SHA-256加密
  18. java方法头_java方法学习
  19. 全球最强人工智能创新公司Top100榜单重磅发布!
  20. 分布式ssh_使用SSH的分布式管理

热门文章

  1. 数据结构和算法(03)---栈和队列(c++)
  2. 手写文字识别java_java 手写文字图片识别提取 百度API
  3. 详细描述三个适于瀑布模型的项目_IT项目管理笔记——方法选择和软件评估
  4. 基于Mac环境搭建以太坊私有区块链进行挖矿模拟
  5. Java多线程死锁例子
  6. 科目三-变更车道,直线行驶和超车的考试标准
  7. [GCC for C]编译选项---IDE掩盖下的天空
  8. 如何在 IDEA 启动多个 Spring Boot 工程实例
  9. lineNumber: 1; columnNumber: 1; 前言中不允许有内容
  10. 回溯---分割字符串使得每个部分都是回文数