成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET MVC 示例項目:Suteki.Shop

開發 后端
本文分析了ASP.NET MVC 示例項目Suteki.Shop。這個示例未使用微軟自已的Unity框架來實現IOC,而是使用了大名鼎鼎Castle Windsor。

在這個ASP.NET MVC 示例:Suteki.Shop中,未使用微軟自已的Unity框架來實現IOC,而是使用了大名鼎鼎Castle Windsor。因為引用了Windsor,就有必要簡要介紹一下。而我的理解,這個IOC容器(Container)包括下面幾個重要概念:

容器(Container):Windsor是一個反轉控制容器。它創建在一個微內核的基礎之上,這個微內

核能夠掃描類并且試圖找到這些類用到哪些對象引用、對象依賴,然后把這些依賴信息提供給類使用。

組件(Component):也就是我們通常所說的業務邏輯單元及相應的功能實現,組件是一個可復

用的代碼單元。它應該實現并暴露為一個服務。組件是實現一個服務或接口的類。

服務(Service) :也就是相應的組件接口或N個Component按業務邏輯組合而成的業務邏輯接口。

接口是服務的規范,它創建一個抽象層,你可以輕松的替換服務的實現。

擴張單元插件(Facilities):提供(可擴張)容器以管理組件。

我們可以直接使用組件(會在下面的內容中提到),也可以把組件轉換成相應的服務接口來使用。 

還記得上一篇文章中提到的Service嗎? 說白了,它就是一個服務。而Suteki.Shop做的更“夸張”,要是帶有業務邏輯性質的功能代碼都可以被視為Component或服務,比如說前幾篇文章中所提到的Filter,ModelBinder。甚至是服務組件初始化的輔助類(WindsorServiceLocator)也一并拿下。

為了便于理解,下面就到Suteki.Shop中看一下其是如何做的   

首先我們看一下整個Suteki.Shop項目啟動的入口,同時這也是Windsor IOC容器初始化的起點。而這塊功能代碼是放在了Global.asax(Suteki.Shop\Global.asax)中的Application_Start方法中實現的,下面是該方法的聲明:

ASP.NET MVC 示例代碼

  1. protected void Application_Start(object sender, EventArgs e)  
  2. {  
  3.     RouteManager.RegisterRoutes(RouteTable.Routes);  
  4.     InitializeWindsor();  
  5. }  

代碼中的RouteManager.RegisterRoutes是實現對Route規則的綁定,而規則的內容是被硬編碼到RouteManager中實現的。關于Route的資料網上有不少,園子里也有不少朋友寫過,這里就不做說明了。

接就上面方法就會運行InitializeWindsor(),這就是Windsor容器初始化的方法:

ASP.NET MVC 示例代碼

  1. /// < summary>  
  2. /// This web application uses the Castle Project's IoC container, Windsor see:  
  3. /// http://www.castleproject.org/container/index.html  
  4. /// < /summary>  
  5. protected virtual void InitializeWindsor()  
  6. {  
  7.     if (container == null)  
  8.     {  
  9.         // create a new Windsor Container  
  10.         container = ContainerBuilder.Build("Configuration\\Windsor.config");   
  11.  
  12.         WcfConfiguration.ConfigureContainer(container);  
  13.  
  14.         ServiceLocator.SetLocatorProvider(() => container.Resolve< IServiceLocator>());  
  15.         // set the controller factory to the Windsor controller factory (in MVC Contrib)  
  16.         System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));  
  17.     }  
  18. }  
  19.  

注:“Configuration\\Windsor.config”中的內容較長,主要是一些XML配置節點。大家可以抽時間閱讀一下即可。

這個方法是今天講解的主要內容,下面就介紹一下其中的代碼。

首先是判斷container(IWindsorContainer類型)是否為空,如果容器為空則創建并初始化該容器。也就是調用ContainerBuilder(Suteki.Shop\ContainerBuilder)類的Build方法來從外部的config文件中加載默認信息。我們這里就看一下Build方法的實現:

ASP.NET MVC 示例代碼:

  1. public static IWindsorContainer Build(string configPath)  
  2. {  
  3.         var container = new WindsorContainer(new XmlInterpreter(configPath));  
  4.  
  5.         // register handler selectors  
  6.         container.Kernel.AddHandlerSelector(new UrlBasedComponentSelector(  
  7.             typeof(IBaseControllerService),  
  8.             typeof(IImageFileService),  
  9.             typeof(IConnectionStringProvider)  
  10.             ));  
  11.  
  12.         // automatically register controllers  
  13.         container.Register(AllTypes  
  14.             .Of< Controller>()  
  15.             .FromAssembly(Assembly.GetExecutingAssembly())  
  16.             .Configure(c => c.LifeStyle.Transient.Named(c.Implementation.Name.ToLower())));  
  17.  
  18.         container.Register(  
  19.             Component.For< IUnitOfWorkManager>().ImplementedBy< LinqToSqlUnitOfWorkManager>().LifeStyle.Transient,  
  20.             Component.For< IFormsAuthentication>().ImplementedBy< FormsAuthenticationWrapper>(),  
  21.             Component.For< IServiceLocator>().Instance(new WindsorServiceLocator(container)),  
  22.             Component.For< AuthenticateFilter>().LifeStyle.Transient,  
  23.             Component.For< UnitOfWorkFilter>().LifeStyle.Transient,  
  24.             Component.For< DataBinder>().LifeStyle.Transient,  
  25.             Component.For< LoadUsingFilter>().LifeStyle.Transient,  
  26.             Component.For< CurrentBasketBinder>().LifeStyle.Transient,  
  27.             Component.For< ProductBinder>().LifeStyle.Transient,  
  28.             Component.For< OrderBinder>().LifeStyle.Transient,  
  29.             Component.For< IOrderSearchService>().ImplementedBy< OrderSearchService>().LifeStyle.Transient,  
  30.             Component.For< IEmailBuilder>().ImplementedBy< EmailBuilder>().LifeStyle.Singleton  
  31.         );  
  32.  
  33.         return container;  
  34. }  
  35.  

首先是讀入指定配置文件的XML結點信息,將構造一個 WindsorContainer實現,同時在其微內核中添加“容器處理組件”的方式(AddHandlerSelector),注意這種處理方式是按我們在業務邏輯中規定的方式處理的。

緊跟著又向該容器中注冊了Controller,而且配置屬性的LifeStyle被指定為Transient類型,這里有必要介紹一下Castle容器的組件生存周期,主要有如下幾種:  

Singleton : 容器中只有一個實例將被創建

Transient : 每次請求創建一個新實例

PerThread: 每線程中只存在一個實例

PerWebRequest : 每次web請求創建一個新實例

Pooled :使用"池化"方式管理組件,可使用PooledWithSize方法設置池的相關屬性。

可以看到在本項目中,組件的生命周期基本上都被指定成為Transient類型,即當請求發生時創建,在處理結束后銷毀。

接著再看一下該方法的其余代碼,也就是對ModelBinder,Filter,Service這類業務邏輯的組件注冊。同時我們看到有的組類在進行接口注冊的同時還被綁定了默認的實現類,其這種硬編碼的方法是是一種“可選”方式。

說完了Build方法之前,再回到Global.asax文件中的InitializeWindsor方法,看一下其余的代碼。我們看到這樣一行:

  1. WcfConfiguration.ConfigureContainer(container);  

類WcfConfiguration的ConfigureContainer方法就是繼續向當前創建的容器中添加組件,而這次要加入的組件是Windows Live Writer的IMetaWeblog接口實現類,如下:

  1. public static class WcfConfiguration  
  2. {  
  3.     public static void ConfigureContainer(IWindsorContainer container)  
  4.     {  
  5.         var returnFaults = new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true };  
  6.  
  7.         container.AddFacility< WcfFacility>(f =>  
  8.         {  
  9.             f.Services.AspNetCompatibility = AspNetCompatibilityRequirementsMode.Required;  
  10.             f.DefaultBinding = new XmlRpcHttpBinding();  
  11.         })  
  12.             .Register(  
  13.                 Component.For< IServiceBehavior>().Instance(returnFaults),  
  14.                 Component.For< XmlRpcEndpointBehavior>(),  
  15.                 Component.For< IMetaWeblog>().ImplementedBy< MetaWeblogWcf>().Named("metaWebLog").LifeStyle.Transient  
  16.                 );  
  17.  
  18.     }  
  19. }  
  20.  

如前面所說的,擴張單元插件(Facilities)可以在不更改原有組件的基礎上注入你所需要的功能代碼,這里就使用了其AddFacility方法來添加擴展單元來注冊并管理我們的Windows Live Writer組件。

下面繼分析InitializeWindsor方法中的其余代碼,看完了ConfigureContainer方法,接著就是下面這一行代碼了:    

  1. ServiceLocator.SetLocatorProvider(() => container.Resolve< IServiceLocator>()); 

剛看到這一行讓我感覺似曾相識,記得以前在看Oxite的Global.asax中也看過類似的這樣一行代碼。    

  1. ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));   

只不過那個項目中用的是 Unity而不是Castle Windsor。但實際的功能是一樣的。即完成對容器中服務地址的解析綁定。有了它,就可以通過Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase中所定義的方法如:DoGetInstance或DoGetAllInstances 來獲取相應的服務組件(集合)的實例。

比如本項目中的DoGetInstance及DoGetAllInstances()實現代碼如下:

(ASP.NET MVC 示例代碼:Suteki.Common\Windsor\WindsorServiceLocator.cs):

  1. protected override object DoGetInstance(Type serviceType, string key)  
  2. {  
  3.     if (key != null)  
  4.         return container.Resolve(key, serviceType);  
  5.     return container.Resolve(serviceType);  
  6. }  
  7.  
  8. /// < summary>  
  9. /// When implemented by inheriting classes, this method will do the actual work of  
  10. /// resolving all the requested service instances.  
  11. /// < /summary>  
  12. /// < param name="serviceType">Type of service requested.< /param>  
  13. /// < returns>  
  14. /// Sequence of service instance objects.  
  15. /// < /returns>  
  16. protected override IEnumerable< object> DoGetAllInstances(Type serviceType)  
  17. {  
  18.     return (object[])container.ResolveAll(serviceType);  
  19. }  
  20.  

注,對該WindsorServiceLocator類的IOC綁定在ContainerBuilder.Build中,如下:   

  1. container.Register(  
  2.        Component.For< IUnitOfWorkManager>().ImplementedBy< LinqToSqlUnitOfWorkManager>().LifeStyle.Transient,  
  3.        Component.For< IFormsAuthentication>().ImplementedBy< FormsAuthenticationWrapper>(),  
  4.        Component.For< IServiceLocator>().Instance(new WindsorServiceLocator(container)),  

而InitializeWindsor方法中的***一行代碼如下:       

  1. System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));  

這里要說明的是WindsorControllerFactory這個類是在 MvcContrib項目中提供的,用于構造一個Castle項目類型的Controller工廠。

【編輯推薦】

  1. ASP.NET關機代碼(Windows為本機)
  2. ASP.NET QueryString亂碼解決問題
  3. ASP.NET畫面跳轉實現及其傳值問題解決方案
  4. ASP.NET Web應用程序用戶操作信息描述類
  5. ASP.NET之父強烈推薦:ASP.NET AJAX著作

責任編輯:book05 來源: csdn
相關推薦

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-07-23 11:33:18

2009-07-29 09:17:12

jQuery刪除

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-04-01 12:00:43

ASP.NETMVC

2011-09-22 10:58:56

ASP.NET

2009-09-09 09:09:17

ASP.NET MVC

2010-06-23 15:44:03

ASP.NET MVC

2009-07-31 10:34:41

ASP.NET抓取網頁

2009-08-07 16:09:25

ASP.NET AJA

2010-03-19 09:17:16

ASP.NET MVC

2009-07-24 11:33:12

MVC單元測試ASP.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色综合色综合色综合 | 亚洲午夜精品久久久久久app | 韩日一区二区三区 | 99re视频 | 91 在线| 欧美 日韩 亚洲91麻豆精品 | 久久久国产一区二区三区 | 日韩一级| 综合久久av | 91麻豆产精品久久久久久夏晴子 | 国产精品久久久久久二区 | 国产成人精品一区二区三区网站观看 | 蜜桃av一区二区三区 | 日韩中文字幕高清 | 国产高清在线精品一区二区三区 | 97人人澡人人爽91综合色 | 九色 在线| 在线观看成人小视频 | 成人精品国产 | 黄色在线免费观看视频 | 欧美男人的天堂 | 国产精品久久久久久久久久软件 | 亚洲综合首页 | 超碰97在线免费 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 成人a视频在线观看 | 天天躁日日躁狠狠很躁 | 国产精品久久国产精品 | 亚洲精品女人久久久 | 在线欧美一区 | 国产一区二区三区久久久久久久久 | 国产成人99久久亚洲综合精品 | 亚洲欧美国产视频 | 国产69精品久久99不卡免费版 | 免费影视在线观看 | 亚洲成人午夜电影 | 最新91在线 | 亚洲欧美国产一区二区三区 | 国产精品久久久久9999鸭 | 久久精片 | 日韩第一区 |