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

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

 

ExpandedBlockStart.gifProcessRequest
        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,就必须管理这个框架中具体对象的创建工作。
即通过配置文件的方式决定一个具体对象的生或死!
ExpandedBlockStart.gifObjects
<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工厂的代码

ExpandedBlockStart.gifControllerFactory
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 容器包装的代码

 

ExpandedBlockStart.gifContainer
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中添加相应配置

 

ExpandedBlockStart.gifWeb.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再读王垠的《编程的智慧》,有怎样的感想?

王垠老师的《编程的智慧》这篇文章已经读了最起码5遍了&#xff0c;最近的项目做完一个阶段&#xff0c;到了把他做干净的时候&#xff0c;也就是优化代码&#xff0c;全面整理的阶段&#xff0c;这个时候我又想起了这篇编程的智慧&#xff0c;有一些启发与大家分享。王垠老师的…

简单的FreeBSD 的内核编译

简单的FreeBSD 的内核编译 删除并重新下载内核源码 删除自带的内核源码rm -rf /usr/src下载内核源码wget https://download.freebsd.org/ftp/releases/amd64/11.1-RELEASE/src.txz也可以使用国内的源地址下载wget http://ftp1.chinafreebsd.cn/pub/FreeBSD/releases/amd64/11.1…

国外流行的五款免费在线图片编辑器评测

也许当你在度假的时候&#xff0c;不喜欢携带着你的笔记本电脑&#xff0c;但你在度假的时候一定会拍照。现在&#xff0c;你可以打理这些照片&#xff0c;甚至还可以在“网络咖啡屋”中进行一些高级的图像编辑。一些基于网络的照片编辑程序在去年逐渐兴起&#xff0c;大多是基…

Python3——类

Python3 —— 类 目录 Python3 —— 类 创建和使用类&#xff08;class&#xff09; 继承&#xff08;class Man(People)&#xff09; 导入类&#xff08;与导入模块一样&#xff09; 创建和使用类&#xff08;class&#xff09; 类&#xff1a;属性&#xff0c;方法 比…

void 型指针的高阶用法,你掌握了吗?

[导读] 要比较灵活的使用C语言实现一些高层级的框架时&#xff0c;需要掌握一些进阶编程技巧&#xff0c;这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1推荐一首中文歌曲<<后来>>&#xff0c;英文翻唱<<life>>来自瑞典歌手Sofia Kal…

对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作

对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作 1 /**2 * <html>3 * <body>4 * <P> Copyright 1994 JsonInternational</p>5 * <p> All rights reserved.</p>6 * <p> Created on 19941115</p>7 * <p> C…

电子美图更新36张!

电子美图更新36张&#xff0c;下面请欣赏&#xff01;如果喜欢&#xff0c;请帮忙点“赞”和"在看"哦&#xff01;推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点…

关于培训1

这个笔记其实应该不久前就写了&#xff0c;直到今天早上才有时间来动手。这次培训是关于本地化L10N&#xff0c;和国际化I12N&#xff0c;还有全球化G11N的一次详细介绍。具体来说&#xff0c;是关于UNICODE和一些老的编码的介绍。关于一个字符占有多少个字节&#xff0c;还有字…

Python3——文件与异常

Python3——文件与异常 目录 Python3——文件与异常 文件 &#xff08;1&#xff09;、打开文件open() &#xff08;2&#xff09;、写文件write() &#xff08;3&#xff09;、从文件读取数据 异常&#xff08;防止程序崩溃&#xff09; &#xff08;1&#xff09;、tr…

PHP页面显示中文字符出现乱码

【出现问题】 php页面显示中文字符出现乱码 【解决方法】 在php页面的代码前插入一行代码即可 header("Content-Type: text/html;charsetutf-8"); 转载于:https://www.cnblogs.com/wangyang0210/p/9187403.html

C#多线程JOIN方法初探

[说明&#xff1a;刚接触多线程时&#xff0c;弄不明白Join()的作用&#xff0c;查阅了三本书&#xff0c;都不明不白。后来经过自己的一番试验&#xff0c;终于弄清了Join()的本质。大家看看我这种写法是否易懂&#xff0c;是否真的写出了Join()的本质&#xff0c;多提宝贵意见…

STM32F0单片机快速入门八 聊聊 Coolie DMA

1.苦力 DMA世上本没有路&#xff0c;走的人多了&#xff0c;便成了路。世上本没有 DMA&#xff0c;需要搬运的数据多了&#xff0c;便有了 DMA。大多数同学应该没有在项目中用过这个东西&#xff0c;因为一般情况下也真不需要这个东西。在早期的单片机中也不存在DMA模块。再加上…

Python3——网络编程基础

Python3——网络编程基础 基础知识参考&#xff1a; https://blog.csdn.net/wqx521/article/details/51037048 https://blog.csdn.net/wqx521/article/details/51056649 https://blog.csdn.net/wqx521/article/details/51056713 https://blog.csdn.net/wqx521/article/deta…

Python学习之==第三方模块的安装、模块导入

一、模块&包 1、模块 模块实质上就是一个Python文件&#xff0c;它是用来组织代码的。意思就是把Python代码写在里面&#xff0c;文件名就是模块的名称。例如&#xff1a;random.py&#xff0c;random就是模块的名称。 2、包 包又叫pageage&#xff0c;本质就是一个文件夹&…

【注册机】Zillions of Games v2.0.1p 注册机

下载地址&#xff1a;http://keygens.nl/crack/87061/转载于:https://www.cnblogs.com/boringlamb/archive/2010/02/24/1672404.html

操作系统中抢占式和非抢占式内核的区别

编排 | strongerHuang微信公众号 | 嵌入式专栏操作系统分为抢占式内核和非抢占式内核&#xff0c;通常RTOS都是抢占式内核。下面就来讲讲抢占式内核和非抢占式内核的内容。非抢占式内核非抢占式内核要求每个任务&#xff08;线程&#xff09;都做一些事情来明确放弃对 CPU 的控…

Python3——简单的TCP实例

Python3网络编程——简单的TCP实例 服务器&#xff1a;创建套接字——绑定服务器地址——监听连接——接受连接——数据接收/发送 客户端&#xff1a;创建套接字——连接服务器地址——数据接收/发送 """ server.py encode()/decode() """ fro…

位图索引,数据库索引浅浅的学习

摘自http://www.cnblogs.com/LBSer/p/3322630.html 位图&#xff08;BitMap&#xff09;索引 前段时间听同事分享&#xff0c;偶尔讲起Oracle数据库的位图索引&#xff0c;顿时大感兴趣。说来惭愧&#xff0c;在这之前对位图索引一无所知&#xff0c;因此趁此机会写篇博文介绍下…

UDP协议 sendto 和 recvfrom 浅析与示例

图片/在思考的樱木花道UDP&#xff08;user datagram protocol&#xff09;用户数据报协议&#xff0c;属于传输层。UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把数据报发给对方。UDP无需建立类如三次握手的连接&#xff0c;使得通信效率很高。…

2010软考软件设计师冲刺精选【专家压轴模拟•下】

2010软考软件设计师冲刺精选【专家压轴模拟•下】 自测简介&#xff1a; 为迎战2010年软考&#xff0c;51CTO特邀请软考专家为网友出了一系列模拟冲刺题。其中包括网络规划设计师、网络工程师、网络管理员、软件设计师、程序员等。本套技术自测是软考软件设计师冲刺模拟题…