Spring.Net —IOC詳解

一. Spring.net中IOC介紹html

  1. 什麼是IOC,控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。jquery

二. Spring.Net基本實現:此處使用的是把引用外部的xml文件封裝object裏的代碼。web

實現步驟,spring

  1. 首先引用兩個dll文件,從 Spring.net2.0中找出這四個文件,而且放在新建的Lib文件夾中,而後導入文件。數據庫

引入文件 : 編程

 

2. 新建一個接口,而且提供一個方法。app

1 namespace SpringNet
2 {
3     public interface IUserInfoService
4     {
5         string msgShow();
6     }
7 }

3.  寫一個類,繼承上面的接口webapp

 1 {
 2     public class UserInfoService : IUserInfoService
 3     {
 4         public string UserName { get; set; }
 5         public PerSon person { get; set; }
 6         public string msgShow()
 7         {
 8             return "hello:" + UserName+",年齡:"+person.Age;
 9         }
10     }
11 }

3.5 加一個person類,後面ref對應的類ide

1 namespace SpringNet
2 {
3     public class PerSon
4     {
5         public int Age { get; set; }
6     }
7 }

 

4 .新建一個winform頁面,而且放一個button按鈕測試

 

5. 配置配置文件,重點看紅色標記的行,其中value是是指當前屬性的值,而ref是指關聯的類的名稱。

重點注意一下:命名空間和類名頗有可能不是同一個

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <configSections>
 4     <sectionGroup name="spring">   <!--配置引用的dll文件的路徑-->
 5       <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
 6       <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
 7                                     <!--配置截止-->
 8     </sectionGroup>
 9   </configSections>
10   <spring>
11     <context>
12       <resource uri="config://spring/objects"/>
13       <!--將xml與配置文件關聯-->
14       <!-- <resource uri="file://XMLServer.xml"/> -->
15     </context>
16     <objects xmlns="http://www.springframework.net">
17       
18       <!--使用xml文件-->
19       <description>An  example that demonstrates simple IoC features.</description>
20                                               <!--命名空間的類全稱,和程序集的名稱-->
21       <object name="UserInfoService" type="SpringNet.UserInfoService, SpringNet">
22         <!--類的屬性-->
23         <property name="UserName" value="張三"/>     
24         <property name="person" ref="PerSon"/>
25         
26         <!--類的屬性-->
27       </object>
28       <object name="PerSon" type="SpringNet.PerSon, SpringNet">
29         <!--類的屬性-->
30         <property name="Age" value="16"/>
31       </object>
32     </objects>
33   </spring>
34 </configuration>

6. button對應的代碼以下:

 1 namespace SpringNet
 2 {
 3     public partial class Form1 : Form
 4     {
 5         public Form1()
 6         {
 7             InitializeComponent();
 8         }
 9 
10         private void button1_Click(object sender, EventArgs e)
11         {
12             IApplicationContext ctx = ContextRegistry.GetContext();
13                             //獲取object的程序集類的對象,而且和對應的接口綁定,而後用接口接收
14             IUserInfoService lister = (IUserInfoService)ctx.GetObject("UserInfoService");
15             MessageBox.Show(lister.msgShow());
16         }
17     }
18 }

 

三. Spring.Net在MVC中應用

1:先導入dll文件。在2.0中找到這些文件,而且放置在一個新建的lib文件夾中,而且引入。

2:將案例中的Config文件夾拷貝到項目中:在webapp項目中新建一個config文件夾,用來存放xml類型的文件。

2.1 修改控制器中本來的new對象的方法。

//本來是這樣new對象 ,改爲下面這樣,其實就時至關於改爲其中一個屬性,而後在配置文件中給該類中這個屬性賦值  
// IBLL.IUserInfoService UserInfoService = new BLL.UserInfoService(); IBLL.IUserInfoService UserInfoService { get; set; }

 

3:修改Config文件夾中的相關的配置信息。 該配置文件的做用主要是爲類的中的一個屬性賦值,注意:type中對應的是命名空間帶類名的全稱,程序集,個人兩個就不同而後這個bug我改了半個月.......

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <objects xmlns="http://www.springframework.net">
 3                                      <!--controller的程序集,專門負責相關控制器-->
 4                             <!--命名空間帶類名的全稱,程序集-->
 5   <object type="OA_MVC.Controllers.UserInfoController, OA-MVC" singleton="false" >
 6     <property name="UserInfoService" ref="userInfoService" />
 7   </object>   
 8   <object name="userInfoService" type="BLL.UserInfoService, UserInfoService" singleton="false" >
 9   </object>
10 </objects>

 


4:修改Web.config文件中的配置。

 1 <!--在<configSections>中配置如下-->
 2     <sectionGroup name="spring">
 3       <!--Spring.Net配置  指對應的處理由Handler執行-->
 4       <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
 5     </sectionGroup>
 6 <!--在跳出上面這個以後,加入如下-->
 7     <spring>
 8     <!--Spring.Net配置  配置處理,配置xml文件路徑-->
 9     <context>
10       <resource uri="file://~/Config/controllers.xml"/>
11       <resource uri="file://~/Config/services.xml"/>
12     </context>
13   </spring>
14  

5:能夠將Config/controllers.xml文件中的配置信息分離(能夠將控制器的配置與業務類的配置分離。)注意web.config文件中也要修改一下。

就是指把第三步的紅色的object文件夾中的文件分離出來新建一個xml文件,而且在web.config配置中,也要注意加入業務類對應的xml文件路徑。
6:修改Global文件.使其繼承SpringMvcApplication

 1 namespace OA_MVC
 2 {
 3     // 注意: 有關啓用 IIS6 或 IIS7 經典模式的說明,
 4     // 請訪問 http://go.microsoft.com/?LinkId=9394801
 5     //SpringMvcApplication繼承System.Web.HttpApplication,而且SpringMvcApplication自帶容器,因此不用本身構建
 6     public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication
 7     {
 8         protected void Application_Start()
 9         {
10             AreaRegistration.RegisterAllAreas();
11 
12             WebApiConfig.Register(GlobalConfiguration.Configuration);
13             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
14             RouteConfig.RegisterRoutes(RouteTable.Routes);
15             BundleConfig.RegisterBundles(BundleTable.Bundles);
16         }
17     }
18 }

四. 異常處理

1.新建一個MyExceptionAttribute類,用來處理異常,將異常加載進入隊列中

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 namespace OA_MVC.Models
 7 {
 8     public class MyExceptionAttribute : HandleErrorAttribute
 9     {
10         //新建一個異常類型的隊列,而且設置靜態的隊列,就向同一個隊列中插入
11         public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
12         public override void OnException(ExceptionContext filterContext)
13         {
14             base.OnException(filterContext);
15             Exception ex = filterContext.Exception;   //建立一個異常
16             ExceptionQueue.Enqueue(ex);   //將異常追加到隊列最後
17             //跳轉錯誤頁
18             filterContext.HttpContext.Response.Redirect("/Error.html");
19         }
20     }
21 }

2. 在Global.asax文件中開啓線程,捕獲異常,由於該文件是最初啓動的,而且線程一直啓動。而後將啓動的線程日誌放在log文件夾中。15號之後是關鍵代碼

 1 namespace OA_MVC  //該文件是應用程序加載就會自動執行,而且不間斷執行的
 2 {
 3     // 注意: 有關啓用 IIS6 或 IIS7 經典模式的說明,
 4     // 請訪問 http://go.microsoft.com/?LinkId=9394801
 5     //SpringMvcApplication繼承System.Web.HttpApplication,而且SpringMvcApplication自帶容器,因此不用本身構建
 6     public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication
 7     {
 8         protected void Application_Start()
 9         {
10             AreaRegistration.RegisterAllAreas();
11             WebApiConfig.Register(GlobalConfiguration.Configuration);
12             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
13             RouteConfig.RegisterRoutes(RouteTable.Routes);
14             BundleConfig.RegisterBundles(BundleTable.Bundles);
15             //開啓一個線程,掃描異常信息隊列。
16             string filePath = Server.MapPath("/Log/");   //獲取存放日誌文件的物理路徑
17             //開啓一個線程池       須要傳遞一個委託的object
18             ThreadPool.QueueUserWorkItem((a) =>
19             {
20                 while (true)
21                 {
22                     //判斷一下隊列中是否有數據
23                     if (MyExceptionAttribute.ExceptionQueue.Count() > 0)
24                     {
25                         //出隊,誰先進去,誰就先出去
26                         Exception ex=MyExceptionAttribute.ExceptionQueue.Dequeue();//出隊
27                         if (ex != null)
28                         { 
29                             //將異常寫入日誌文件中。
30                             string fileName = DateTime.Now.ToString("YYYY-MM-dd");
31                             //若是文件有,就追加,若是沒有就新建立一個而且寫入,三個參數,第一個是文件名,第二個是須要填充的內容,第三個是編碼格式
32                             File.AppendAllText(filePath+fileName+".txt",ex.ToString(),System.Text.Encoding.UTF8);
33                         } 
34                     }
35                     else
36                     {
37                         //若是隊列中沒有數據休息3秒鐘
38                         Thread.Sleep(3000);
39                     }
40                 }
41             }, filePath);
42         }
43     }
44 }

 3. 關鍵點,修改App_Start文件夾下的FilterConfig文件

 1     public class FilterConfig
 2     {
 3         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
 4         {
 5             //捕獲異常註冊,修改下面代碼
 6             //filters.Add(new HandleErrorAttribute());
 7             filters.Add(new MyExceptionAttribute());
 8         }
 9     }
10 }

 

五. Log4Net日誌處理

Log4Net是用來記錄日誌的,能夠將程序運行過程當中的信息輸出到一些地方(文件、數據庫、EventLog等),日誌就是程序的黑匣子,能夠經過
日誌查看系統的運行過程,從而發現系統的問題。日誌的做用:將運行過程的步驟、成功失敗記錄下來,將關鍵性的數據記錄下來分析系統問題所在。Log4J。
對於網站來說,不能把異常信息顯示給用戶,異常信息只能記錄到日誌,出了問題把日誌文件發給開發人員,就能知道問題所在。


配置Log4Net環境


(1)新建一個WebApplication 應用程序

(2)添加對log4net.dll的引用(bin\net\2.0\release 不能引用debug版本)(把相應的dll文件拷貝到項目中的lib文件夾下。)


(3)在Web.Config (或App.Config)添加配置,見備註
加入configSections配置文件中


(4)初始化:在程序最開始(Global文件中)加入log4net.Config.XmlConfigurator.Configure();不要加到頁面的Load,  

 

(5)在要打印日誌的地方LogManager.GetLogger(typeof(Program)).Debug(「信息」); 。經過LogManager.GetLogger傳遞要記錄的日誌類類名得到這個類的ILog(這樣在日誌文件中就能看到這條日誌是哪一個類輸出的了),而後調用Debug方法輸出消息。由於一個類內部不止一個地方要打印日誌,因此通常把ILog聲明爲一個static字段。
Private static ILog logger=LogManager.GetLogger(typeof(Test))
輸出錯誤信息用ILog.Error方法,第二個參數能夠傳遞Exception對象。log.Error("***錯誤"+ex),log.Error("***錯誤",ex)
測試代碼:


Appender:能夠將日誌輸出到不一樣的地方,不一樣的輸出目標對應不一樣的Appender:RollingFileAppender(滾動文件)、AdoNetAppender(數據庫)、SmtpAppender (郵件)等。

level(級別):標識這條日誌信息的重要級別。None>Fatal>ERROR>WARN>DEBUG>INFO>ALL,設定一個Level,那麼低於這個Level的日誌是不會被寫到Appender中的。

Log4Net還能夠設定多個Appender,能夠實現同時將日誌記錄到文件、數據、發送郵件等;能夠設定不一樣的Appender的不一樣的Level,能夠實現普通級別都記錄到文件,Error以上級別發送郵件;能夠實現對不一樣的類設定不一樣的Appender;還能夠自定義Appender,這樣能夠本身實現將Error信息發短信等。

(*)除了Log4Net,還有Enterprise Library中的Logging Application Block、Apache的CommonLog 以及NLog等,都差很少。

六. 基本登陸完成

1. 先加一個登錄頁面,引入image文件夾,修改js和jquery文件路徑。

2. 加驗證碼功能,先在common文件夾中加入ValidateCode.cs類文件,切記引入system.web

3. 修改登錄頁面中圖片src路徑

七. 登陸問題(重定向問題,Session問題)

相關文章
相關標籤/搜索