asp.net MVC2 初探十一

本节介绍如何实现将controller加载进spring容器。首先我们看看配置文件,我就以我做的例子来进行说明先看webConfig,在configuration节点下配置以下内容
< configSections > 
         < sectionGroup  name ="spring" > 
             < section  name ="context"  type ="Spring.Context.Support.WebContextHandler, Spring.Web" /> 
             < section  name ="objects"  type ="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 
         </ sectionGroup > 
         < section  name ="SpringOverrideProperty"  type ="System.Configuration.NameValueSectionHandler" /> 
         < section  name ="nhibernate"  type ="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     </ configSections > 
     < spring > 
         < context > 
             < resource  uri ="config://spring/objects" /> 
             < resource  uri ="assembly://SpringDao/SpringDao/spring_hibernate_dao.xml" /> 
             < resource  uri ="assembly://SpringDao/SpringDao/Controller.xml" > </ resource > 
         </ context > 
         < objects  xmlns ="http://www.springframework.net" /> 
     </ spring >
在system.web节点下配置以下内容
< httpModules > 
             < add  name ="Spring"  type ="Spring.Context.Support.WebSupportModule, Spring.Web" /> 
         </ httpModules > 
         < httpHandlers > 
             < add  verb ="*"  path ="*.aspx"  type ="Spring.Web.Support.PageHandlerFactory, Spring.Web" /> 
         </ httpHandlers >
ok,WebConfig配置完成。再看我写的两个xml,第一个Controller.xml
<? xml  version ="1.0"  encoding ="utf-8" ?> 
< objects  xmlns ="http://www.springframework.net" 
                  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 
                  xsi:schemaLocation ="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd" > 
     < object  id ="ssCode"  type ="Model.SS_CODE,Model" > 
         < property  name ="C_DATA"  value ="2" > </ property > 
     </ object > 
     < object  id ="CodeController"  type ="Controllers.CodeController,NormalUniversity"  singleton ="false"     autowire ="byName"  > 
         < property     name ="ssCode"  ref ="ssCode" > </ property > 
     </ object > 
</ objects >
这个文件配置的是Spring要加载进容器的Controller。以及controller中的类( Controllers.CodeController,NormalUniversity,其中Controllers.CodeController是命名空间.类名,NormalUniversity是程序集名称),以及类中的属性。下面是spring_hibernate_dao.xml
<? xml  version ="1.0"  encoding ="utf-8"  ?> 
< objects  xmlns ="http://www.springframework.net" 
                  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 
                  xsi:schemaLocation ="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd" > 

     < object  id ="DbProvider"  type ="SpringDao.SQLProvider, SpringDao" > 
         < property  name ="ConnectionString"  value ="server=.\sql2k5;uid=sa;pwd=sa123;database=test;"  /> 
     </ object > 

     < object  id ="SessionFactory"  type ="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12" > 
         < property  name ="DbProvider"  ref ="DbProvider"  /> 
         < property  name ="MappingAssemblies" > 
             < list > 
                 < value >Model </ value > 
             </ list > 
         </ property > 
         < property  name ="HibernateProperties" > 
             < dictionary > 
                 < entry  key ="hibernate.connection.provider"  value ="NHibernate.Connection.DriverConnectionProvider"  /> 
                 < entry  key ="hibernate.dialect"  value ="NHibernate.Dialect.MsSql2005Dialect"  /> 
                 < entry  key ="hibernate.connection.driver_class"  value ="NHibernate.Driver.SqlClientDriver"  /> 
                 < entry  key ="show_sql"  value ="true"  /> 
             </ dictionary > 
         </ property > 
     </ object > 

     < object  id ="HibernateTransactionManager"  type ="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12" > 
         < property  name ="DbProvider"  ref ="DbProvider"  /> 
         < property  name ="sessionFactory"  ref ="sessionFactory"  /> 
     </ object > 

     < object  id ="TransactionInterceptor"  type ="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data" > 
         < property  name ="TransactionManager"  ref ="HibernateTransactionManager"  /> 
         < property  name ="TransactionAttributeSource" > 
             < object  type ="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data"  /> 
         </ property > 
     </ object > 
     < object  id ="DaoHelper"  type ="Dao.SS_CodeDao,Dao" > 
         < property  name ="sessionFactory"  ref ="sessionFactory"  /> 
     </ object > 

</ objects > 
配置了Spring的工厂,拦截器,事务。以及我写的一个Dao类。要实现controller的加载,必须写一个自定义的ControllerFactory实现IControllerFactory接口。代码如下
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif using Spring.Context; 
InBlock.gif using System.Web.Mvc; 
InBlock.gif using System.Web.Routing; 
InBlock.gif using System.Web; 
InBlock.gif namespace SpringDao 
InBlock.gif
InBlock.gif         public  class ControllerFactory : IControllerFactory 
InBlock.gif        { 
InBlock.gif                 private  static DefaultControllerFactory defalutf =  null
InBlock.gif 
InBlock.gif                 public IController CreateController(RequestContext requestContext,  string controllerName) 
InBlock.gif                { 
InBlock.gif                         string controller = controllerName +  "Controller"
InBlock.gif                     
InBlock.gif                        IApplicationContext ctx = Container.GetContext(); 
InBlock.gif                         if (ctx.ContainsObject(controller)) 
InBlock.gif                        { 
InBlock.gif                                 object controllerf = ctx.GetObject(controller); 
InBlock.gif                                 return (IController)controllerf; 
InBlock.gif                        } 
InBlock.gif                         else 
InBlock.gif                        { 
InBlock.gif                                 if (defalutf ==  null
InBlock.gif                                { 
InBlock.gif                                        defalutf =  new DefaultControllerFactory(); 
InBlock.gif                                } 
InBlock.gif 
InBlock.gif                                 return defalutf.CreateController(requestContext, controllerName); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 public  void ReleaseController(IController controller) 
InBlock.gif                { 
InBlock.gif                        IApplicationContext ctx = Container.GetContext(); 
InBlock.gif 
InBlock.gif                         if (!ctx.ContainsObject(controller.GetType().Name)) 
InBlock.gif                        { 
InBlock.gif                                 if (defalutf ==  null
InBlock.gif                                { 
InBlock.gif                                        defalutf =  new DefaultControllerFactory(); 
InBlock.gif                                } 
InBlock.gif 
InBlock.gif                                defalutf.ReleaseController(controller); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        } 
InBlock.gif
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif using Spring.Context; 
InBlock.gif using Spring.Context.Support; 
InBlock.gif using System.Collections; 
InBlock.gif namespace SpringDao 
InBlock.gif
InBlock.gif         public  class Container 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取应用程序上下文. 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns><see cref="IApplicationContext"/>应用程序上下文.</returns> 
InBlock.gif                 public  static IApplicationContext GetContext() 
InBlock.gif                { 
InBlock.gif                         if (FApplicationContext ==  null
InBlock.gif                        { 
InBlock.gif                                FApplicationContext = ContextRegistry.GetContext(); 
InBlock.gif                        } 
InBlock.gif                         return FApplicationContext; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取应用程序上下文. 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="name"><see cref="IApplicationContext"/>应用程序上下文名称.</param> 
InBlock.gif                 /// <returns><see cref="IApplicationContext"/>应用程序上下文.</returns> 
InBlock.gif                 public  static IApplicationContext GetContext( string name) 
InBlock.gif                { 
InBlock.gif                         return ContextRegistry.GetContext(name); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取对象. 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <typeparam name="T">对象的类型.</typeparam> 
InBlock.gif                 /// <param name="id">标识.</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  static T GetObject<T>( string id) 
InBlock.gif                { 
InBlock.gif                         return (T)GetContext().GetObject(id); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取对象类表. 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <typeparam name="T">对象的类型.</typeparam> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  static IList<T> GetObjects<T>() 
InBlock.gif                { 
InBlock.gif                        IEnumerable items = GetContext().GetObjectsOfType( typeof(T)); 
InBlock.gif                        IList<T> objects =  new List<T>(); 
InBlock.gif                         foreach (DictionaryEntry item  in items) 
InBlock.gif                        { 
InBlock.gif                                objects.Add((T)item.Value); 
InBlock.gif                        } 
InBlock.gif                         return objects; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                [ThreadStatic] 
InBlock.gif                 private  static IApplicationContext FApplicationContext; 
InBlock.gif 
InBlock.gif        } 
InBlock.gif
这些代码是我从网上直接copy的,直接拿来用。完了之后我们要把controller的工厂重新指定到我们自定义的工厂。
在Global.asax的Application_Start()方法中,加入以下代码
InBlock.gifControllerBuilder.Current.SetControllerFactory( typeof(SpringDao.ControllerFactory));
然后再看看我们的controller
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Collections; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Web; 
InBlock.gif using System.Web.Mvc; 
InBlock.gif using Model; 
InBlock.gif using NHibernate.Expression; 
InBlock.gif namespace Controllers 
InBlock.gif
InBlock.gif         public  class CodeController : BaseController<SS_CODE> 
InBlock.gif        { 
InBlock.gif                 private SS_CODE ssCode { set; get; } 
InBlock.gif 
InBlock.gif                 public ActionResult Index() 
InBlock.gif                { 
InBlock.gif                        ssCode.C_DATA =  "aaaa"
InBlock.gif                         return  base.Index1( "~/Views/System/Code/Index.aspx"); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif
在这里我们不用实例化SS_CODE 就可以直接使用其对象。最后讲一下Log4Net。用于在客户端写入日志,配置如下
<? xml  version ="1.0"  encoding ="utf-8"  ?> 
< log4net > 
     < logger  name ="WebLogger" > 
         < level  Value ="DEBUG" > </ level > 
         < appender-ref  ref ="LogFileAppender"  /> 
         < appender-ref  ref ="RollingLogFileAppender" > </ appender-ref > 
     </ logger > 
     < appender  name ="RollingLogFileAppender"  type ="log4net.Appender.RollingFileAppender" > 
        <!-- 日志文件名开头--> 
         < file  value ="App_Data\\Log.txt"  /> 
        <!-- 是否追加到文件--> 
         < appendToFile  value ="true"  /> 
        <!-- 混合使用日期和文件大小变换日志文件名--> 
         < rollingStyle  value ="Composite"  /> 
        <!-- 日期的格式--> 
         < datePattern  value ="yyyyMMdd"  /> 
        <!-- 最大变换数量--> 
         < maxSizeRollBackups  value ="10"  /> 
        <!-- 最大文件大小--> 
         < maximumFileSize  value ="1MB"  /> 
         < layout  type ="log4net.Layout.PatternLayout" > 
             < conversionPattern  value ="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"  /> 
         </ layout > 
     </ appender > 
</ log4net > 
然后新建一个txt如下
打开Assembly,加入
InBlock.gif[assembly: log4net.Config.XmlConfigurator(ConfigFile =  @"App_Data\Log4Net.Config.xml", Watch =  true)]
在web.config configSections加入以下下配置
< section  name ="log4net"  type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net"  />
controller中的代码
InBlock.gif ILog lg = log4net.LogManager.GetLogger( "WebLogger"); 
InBlock.gif                        { 
InBlock.gif                                 if (lg.IsErrorEnabled) 
InBlock.gif                                { 
InBlock.gif                                        lg.Error( this.GetType().ToString()+ "xxxx李磊"); 
InBlock.gif                                         
InBlock.gif                                } 
InBlock.gif                        }
我们发现不能写入汉字,晕啊
怎么办呢?找了好久,我才找到这个办法。首先我们把Log4Net.dll给反射出来
反射到F盘下,我们看看反射的程序集
我们展开log4net\Util,打开Transform.cs,注释掉private static Regex INVALIDCHARS哪一行,重新编译生成dll,就可以写入汉字了。


本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/326473,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值