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,就可以写入汉字了。
有什么问题联系我QQ:316575647
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值