1. 程式人生 > >ASP.NET MVC: 用db4o來做TempDataProvider(另附一個泛型的RedirectToAction方法)

ASP.NET MVC: 用db4o來做TempDataProvider(另附一個泛型的RedirectToAction方法)

關於db4o:

db4o是一種純物件資料庫,相對於傳統的關係資料庫+ORM,db4o具有以下好處:
1)以存物件的方式存取資料(廢話~~,不過你考慮一下完全以物件的方式去考慮資料的存取對傳統的資料庫設計思維來說是多麼大的顛覆);
2)無需資料庫伺服器,只需要一個數據檔案,且dll大小僅為300多k,非常適合作為嵌入式資料庫;
3)提供Query By Sample, Native Query和Simple Object DataBase Access(SODA)三種方式進行資料查詢,操作簡便且功能強大,和sql說byebye。

以上為引用別人的介紹,目前最新的版本為7.5,支援LINQ語法。要使用db4o只需要在專案中引入db4o的DLL就可以,並不需要安裝伺服器端(類似於Access的檔案型資料庫)。

ASP.NET MVC的TempData用於在各個控制器Action間傳輸一些臨時的資料,相信大家都看過“在ASP.NET頁面間傳值的方法有哪幾種”這個面試題,TempData的作用差不多就是這樣。TempData預設是使用Session來儲存臨時資料的,雖然TempData中存放的資料只一次訪問中有效,一次訪問完後就會刪除了的。但很多朋友還是對於將資料存放在Session表示擔心,畢竟Session的資源寶貴啊。

使用db4o來儲存TempData中的資料是一個不錯的選擇。之前看到有說用db4o來做中間層資料快取,當時不是很明白,現在放到這裡來想一想,就闊然開朗了。

ASP.NET MVC提供了一個ITempDataProvider

的介面:

image

只要實現這兩個方法,就可以實現我們的TempDataProvider了。ASP.NET MVC Preview 5 預設還提供了一個CookieTempDataProvider,在Microsoft.Web.Mvc名稱空間下。

在這裡我們先建一個TempObject的類來表示臨時資料,因為TempData是跟使用者對應的(想想Session),所以在這個物件中需要一個識別符號標識當然使用者。在這裡我們就使用SessionId來標識吧。TempObject類的程式碼如下:

TempObject

 然後我們實現ITempDataProvider的兩個方法,程式碼有註釋,就不說了。程式碼如下:

publicclass db4oTempDataProvider : ITempDataProvider
{
    
///<summary>
    
/// 實現介面的獲取TempData方法
    
///</summary>
    
///<param name="controllerContext"></param>
    
///<returns></returns>

publicvirtual IDictionary<stringobject> LoadTempData(ControllerContext controllerContext)
    
{
        HttpContextBase httpContext 
= controllerContext.HttpContext;
        
if (httpContext.Session ==null)
        
{
            
thrownew InvalidOperationException("db4oTempDataProvider: SessionStateDisabled");
        }

        
//如果使用者的Session沒有任何資料,則每次請求的SessionId都是一個新的ID。
        
//只好出此下策,在Session附加一點資料。
        httpContext.Session["db4oTempDataProvider"=1

        
//使用SessionId來標識當前使用者
string sessionId = httpContext.Session.SessionID; 

        
//從db4o資料庫中取出物件
        TempObject temp = Db4oHelper.GetTempObject(sessionId); 

        
// 清理垃圾資料。想想你就會明白為什麼會有垃圾資料了.
        
// 當前時間的30分鐘以前建立的資料都認為是垃圾資料。
        
// 我也不知道多少時間合適,反正Session的預設過期時間是30分鐘。
        Db4oHelper.CleanUp(); 

        
if (temp !=null&& temp.TempObjects !=null)
        
{
            
//取出臨時資料後,將資料刪除,即TempData資料只被訪問一次即刪除
            Db4oHelper.DelTempObject(sessionId); 

            
return temp.TempObjects as Dictionary<stringobject>;
        }
 

        
returnnew Dictionary<stringobject>(StringComparer.OrdinalIgnoreCase);
    }

    
///<summary>
    
/// 實現介面的儲存TempData方法
    
///</summary>
    
///<param name="controllerContext"></param>
    
///<param name="values"></param>

publicvirtualvoid SaveTempData(ControllerContext controllerContext, IDictionary<stringobject> values)
    
{
        HttpContextBase httpContext 
= controllerContext.HttpContext;
        
if (httpContext.Session ==null)
        
{
            
thrownew InvalidOperationException("db4oTempDataProvider: SessionStateDisabled");
        }
 

        TempObject temp 
=new TempObject(httpContext.Session.SessionID);
        temp.TempObjects 
= values; 

        
//將TempData儲存到資料庫
        Db4oHelper.SaveTempObject(temp);
    }

}

附Db4oHelper的程式碼:

Db4oHelper