2012-08-28 30 views
1

最近我一直試圖從數據庫中檢索當前的日期/時間,而不是使用DateTime.Now。爲了做到這一點,我在數據庫上創建了一個函數(GetCurrentDate),並與實體框架連接。爲單個方法使用存儲庫返回單個值?

請注意這是一個Oracle數據庫。

我正在尋找關於如何在我的應用程序中訪問此值的建議。目前我的代碼是這樣的:

namespace Data 
{ 
    public static class Repository 
    { 
     //TODO: is this this best way? 
     public static DateTime Now() 
     { 
      using (Entities ents = new Entities()) { 

       var value = ents.ExecuteStoreQuery<System.DateTime>("SELECT GetCurrentDate FROM dual", null); 
      } 
     } 
    } 
} 

我想知道你對這個簡單方法的想法。存儲庫模式會更合適嗎?那將是什麼樣子?如何處理對象(在每次被調用後)?應該在應用程序的整個生命週期中保持活力嗎?

我想我想知道如何改進這種方法,因爲我認爲它可能缺乏一些。

回答

0

如果你想單元測試和模擬你的應用程序,那麼當然這是有用的,添加這樣的小存儲庫。但是你不應該將它們實現爲靜態類/方法,而是使用IoC容器(如Unity或NInject)並通過構造函數注入來接收它們。這使得嘲笑它們並編寫獨立於數據庫的單元測試成爲可能。

1

爲了控制反轉(IoC)的目的,我寫了一個IClockProvider,它有一個單一的方法Now就是DateTime。

默認實現(在我的應用程序中)它只是一個包裝器,併爲此調用返回DateTime.Now。對於測試,IClockProvider的第二個實現返回一個固定的時間。它看起來像你想做類似的事情,但你的默認供應商調用你提供的代碼來獲得時間。

如果您不想執行依賴注入(DI)(將IClockProvider傳遞給需要它的每個類),因爲這可能需要對現有代碼進行大量重構,您可以將大多數DI庫用於服務位置( SL),那麼您只需要更新代碼來替換任何現有的DateTime.Now調用。服務位置有時被稱爲反模式,但我認爲這有點苛刻,它有它的位置。

public interface IClockProvider 
{ 
    DateTime Now(); 
} 

public class StaticTimeClockProvider : IClockProvider 
{ 
    public DateTime Now() 
    { 
     return DateTime.Parse("2000-01-01 00:00"); 
    } 
} 

public class DefaultTimeClockProvider : IClockProvider 
{ 
    public DateTime Now() 
    { 
     using (Entities ents = new Entities()) 
     { 
      return ents.ExecuteStoreQuery<System.DateTime>("SELECT GetCurrentDate FROM dual", null); 
     } 
    } 
} 

我不使用統一或城堡或任何其他預鍍錫DI或SL框架,我使用的是自制的服務定位器(我強烈反對)。

本質上,它是這樣的,要設置(在Global.asax中)

ServiceLocator.Add<IClockProvider>(DefaultTimeClockProvider); 

,然後當我想訪問一個時鐘提供在這樣的代碼:

ServiceLocator.Locate<IClockProvider>().Now(); 
+0

你有一些這樣的代碼可供我看嗎? –

1

你可以用靜態成員和方法定義一個類,你可以在需要的地方使用它。

如果我是你,我會定義一個名爲_InitialDBTime的靜態成員作爲DateTime和_InitialAppTime作爲DateTime。我還將定義一個名爲initialize的靜態方法,它將使用從數據庫獲取的值和InitialAppTime作爲DateTime.Now初始化您的_InitialDBTime。最後,我將定義另一個名爲GetCurrentTime的靜態方法,它將返回_InitialDBTime.Add(DateTime.Now - _InitialAppTime)。這意味着您只能從數據庫獲得一次的時間,並且您可以計算服務器端的當前時間,而無需在以後的調用中向數據庫發出請求。所以你必須調用Initialize來初始化你的初始時間,並且只要你需要,你可以基於_InitialDBTime和服務器端當前時刻與初始服務器時間之間的差異來計算當前時間。

+0

+1這就是我會做的。 –

相關問題