2012-08-28 33 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这就是我会做的。 –

相关问题