日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/19 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC 整合 Spring.net(1)- Controller进容器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們都知道Asp.net MVC自有一套執(zhí)行機(jī)制。 通過(guò)分析MVC的MvcHandler關(guān)鍵代碼

?

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);
????????????}
????????}

?

?

我們可以認(rèn)為MVC中Controller都是基于工廠模式來(lái)創(chuàng)建對(duì)象的。 但是要利用Spring.net實(shí)現(xiàn)IOC和AOP,就必須管理這個(gè)框架中具體對(duì)象的創(chuàng)建工作。 即通過(guò)配置文件的方式?jīng)Q定一個(gè)具體對(duì)象的生或死! 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框架自己的運(yùn)行機(jī)制決定了Controller的創(chuàng)建不會(huì)經(jīng)過(guò)Spring。 幸好,MVC留下了一個(gè)叫做SetControllerFactory的擴(kuò)展。 即,程序運(yùn)行之初我們就可以用自己的ControllerFactory替換默認(rèn)的ControllerFactory.

??????? protected void Application_Start()
??????? {
??????????? //用自定義的構(gòu)造工廠替換默認(rèn)的
??????????? ControllerBuilder.Current.SetControllerFactory(typeof(Demo.Core.ControllerFactory));

??????????? RegisterRoutes(RouteTable.Routes);
??????? }

?

這樣我們自己的工廠進(jìn)行替換默認(rèn)的Controller工廠后,就可以控制Controller的創(chuàng)建了。

我們自己的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>
????????
///?獲取應(yīng)用程序上下文.
????????
///?</summary>
????????
///?<returns><see?cref="IApplicationContext"/>應(yīng)用程序上下文.</returns>
????????public?static?IApplicationContext?GetContext()
????????{
????????????
if?(FApplicationContext?==?null)
????????????{
????????????????FApplicationContext?
=?ContextRegistry.GetContext();
????????????}
????????????
return?FApplicationContext;
????????}

????????
///?<summary>
????????
///?獲取應(yīng)用程序上下文.
????????
///?</summary>
????????
///?<param?name="name"><see?cref="IApplicationContext"/>應(yīng)用程序上下文名稱.</param>
????????
///?<returns><see?cref="IApplicationContext"/>應(yīng)用程序上下文.</returns>
????????public?static?IApplicationContext?GetContext(string?name)
????????{
????????????
return?ContextRegistry.GetContext(name);
????????}

????????
///?<summary>
????????
///?獲取對(duì)象.
????????
///?</summary>
????????
///?<typeparam?name="T">對(duì)象的類型.</typeparam>
????????
///?<param?name="id">標(biāo)識(shí).</param>
????????
///?<returns></returns>
????????public?static?T?GetObject<T>(string?id)
????????{
????????????
return?(T)GetContext().GetObject(id);
????????}

????????
///?<summary>
????????
///?獲取對(duì)象類表.
????????
///?</summary>
????????
///?<typeparam?name="T">對(duì)象的類型.</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;
????}
}

?

?

然后我們?cè)傩陆▊€(gè)Demos.Controllers的項(xiàng)目。

using System.Web.Mvc;

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

?

? 相應(yīng)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>

?

并把配置文件設(shè)置為嵌入資源

然后再在Web.config中添加相應(yīng)配置

?

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>

?

?

測(cè)試運(yùn)行,我們可以發(fā)現(xiàn)這個(gè)DemoController已在Spring的容器中。

轉(zhuǎn)載于:https://www.cnblogs.com/moshe/archive/2010/02/07/1665344.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET MVC 整合 Spring.net(1)- Controller进容器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。