专门为代表 Now 的 DateTime 制作一个包装器是个好主意吗?

2024-03-01

我最近注意到,为了模拟和测试目的,使用代表“现在”的 DateTime 作为方法的输入参数确实很好。而不是每个方法都调用DateTime.UtcNow他们自己,我在上面的方法中执行一次,然后将其转发到下面的方法中。

所以很多需要“现在”的方法都有一个输入参数DateTime now.

(我正在使用 MVC,并尝试检测一个名为now并将 DateTime.UtcNow 模型绑定到它)

所以而不是:

public bool IsStarted
{
    get { return StartTime >= DateTime.UtcNow; }
}

我通常有:

public bool IsStarted(DateTime now)
{
    return StartTime >= now;
}

所以我现在的惯例是,如果一个方法有一个DateTime参数称为now,你必须用当前时间来喂养它。当然,这取决于约定,其他人可以轻松地将其他日期时间作为参数放入其中。

为了使其更加坚固和静态类型,我正在考虑将 DateTime 包装在一个新对象中,即 DateTimeNow。所以在最上层之一我将转换DateTime to a DateTimeNow当有人尝试修改正常的日期时间时,我们会收到编译错误。

当然,你仍然可以解决这个问题,但至少你会感觉自己做错了什么。 还有其他人走过这条路吗?从长远来看,是否有任何我没有考虑到的好或坏结果?


您可以创建具有必要属性的接口。即IClock并将其作为依赖项注入。

interface IClock
{
    DateTime Now { get; }
    DateTime UtcNow { get; }
}

class SystemClock : IClock
{
    public DateTime Now { get { return DateTime.Now; } }
    public DateTime UtcNow { get { return DateTime.UtcNow ; } }
}

class TestDoubleClock : IClock
{
    public DateTime Now { get { return whateverTime; } }
    public DateTime UtcNow { get { return whateverTime ; } }
}

这样你就可以轻松地对你的代码进行单元测试,这取决于DateTime。通过DateTime.Now到处都是参数听起来很糟糕。如果你需要怎么办Now并且UtcNow还有其他什么?您会仅为此目的添加三个参数吗?

我建议使用这种接口技术来避免带有太多参数的丑陋代码,这对您没有多大帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

专门为代表 Now 的 DateTime 制作一个包装器是个好主意吗? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何在SAPUI5中自定义Shell容器[重复]

    这个问题在这里已经有答案了 我有一个外壳容器 在大屏幕上我想充分利用屏幕 我想覆盖整个区域 我如何定制它 我假设您正在使用 XML 来表达您的观点 添加以下属性appWidthLimited false 到 Shell 标签
  • 如何从我的位置在 Google Maps API V2 中绘制路线 [重复]

    这个问题在这里已经有答案了 我想进行方向应用 但是 我在绘制从我的位置到目的地的路线时遇到问题 我从我的位置获取变量经度和纬度 但我不知道画线 我想绘制到该位置的方向 6 984873352070259 108 48140716552734
  • 从 MediaStream 对象获取媒体详细信息(分辨率和帧速率)

    我正在捕获用户的相机 我想以尽可能最佳的分辨率捕获图片 所以我的代码类似于下面的代码片段 我想从传入流中读取分辨率详细信息 因此我可以将其设置为视频高度和宽度 我将用它来单击快照 我希望快照具有流提供的最佳质量 这可能吗 读取分辨率详细信息
  • “粗箭头”(=>)何时绑定到“this”实例

    粗箭头可以在不同的设置中使用 但不知何故却不能 始终绑定到我想要的实例 粗箭头绑定3次 声明方法时 在方法内声明函数时 在全局上下文中声明函数时 1 声明方法时 当 Coffeescript 编译器遇到以下语法模式时 在类声明中 class
  • 在单个文件中重新启动/撤消冲突解决方案

    在具有多个冲突文件的较大 git 合并中 我错误地将文件标记为已解决 使用git add FILE经过一些编辑 现在我想撤消冲突解决尝试并重新开始解决该文件 我怎样才能做到这一点 在这里找到了解决方案 http gitster livejo
  • 使用 valueForKeyPath 获取数组元素

    有什么办法可以访问NSArray元素与valueForKeyPath 例如 谷歌的反向地理编码服务返回非常复杂的数据结构 如果我想获取城市 现在我必须将其分成两个调用 如下所示 NSDictionary address NSString s
  • 计算 PHP echo 表中的出现次数

    我是 PHP 和 MySQL 的新手 虽然 StackOverflow 上有很多这方面的示例 但它们都不太适合我的情况 所以 我有一张表 名为votes 看起来像这样 student name student id teacher Joe
  • 解释重构[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Question 我的问题是如何教授整理和重构代码的方法和重要性 背景 我最近正在为一位同事进行代码审查 他们对早已消失的同事工作做了一些
  • 如何在 UIlabel 中显示阿拉伯语文本

    我从服务器得到这个字符串作为响应 它实际上是阿拉伯语 1606 1585 1610 1583 1571 1606 1606 1585 1609 1607 1584 1575 1601 1610 1575 1604 1604 1594 157
  • 展平 Scala Spark Dataframe 中的嵌套 json

    我有多个来自任何restapi 的json 但我不知道它的架构 我无法使用 dataframes 的爆炸功能 因为我不知道由 Spark api 创建的列名称 1 我们可以通过解码值来存储嵌套数组元素的键吗dataframe schema
  • Firefox 中的 Ctrl+r 用于刷新页面和我的 php 代码

    我创建了一个表单 所以它是 PHP 和 HTML 混合代码 它有能力发送 POST 当我单击它时 它可以完美地发送和显示输入 But there s something happening when i click Ctrl R in fi
  • OpenCV CUDA Morphology 比 CPU 慢得多

    我正在处理维度图像2208x1242来自 while 循环中的视频 使用 C 和 OpenCV 为了加快速度 我想在 Nvidia Jetson Nano 的 GPU 上执行操作 对于从 BGR 到 HSV 的颜色转换 使用cv cuda
  • 我可以将主窗口过程作为 WinMain 中的 lambda 吗?

    我有一个简单的窗口应用程序 其中声明了主窗口回调过程 WNDCLASSEXW wcx wcx lpfnWndProc MainWndProc 并在之后WinMain我宣布LRESULT CALLBACK MainWndProc HWND m
  • 更改列表的第 n 个元素

    我想更改列表的第 n 个元素并返回一个新列表 我想到了三个相当不优雅的解决方案 defun set nth1 list n value let list2 copy seq list setf elt list2 n value list2
  • Chrome 扩展程序中 Facebook.com 上的 POST 请求失败

    我有一个 Chrome 扩展程序 可以在每个页面上发送包含一些数据的 AJAX POST 问题是 Facebook 阻止了 AJAX 请求 导致 拒绝连接到 URL HERE 因为它 违反以下内容安全策略指令 connect src htt
  • python pandas 将数据帧转换为具有多个值的字典

    我有一个包含 2 列地址和 ID 的数据框 我想在字典中合并具有相同地址的 ID import pandas as pd numpy as np df pd DataFrame Address 12 A 66 C 10 B 10 B 12
  • ClojureScript clojure.set?

    如何在 ClojureScript 中使用 clojure set 我总是收到错误 def middle land set for x water hor y vec clojure set difference set range 0 b
  • 带有片段的空白活动不在 Android Studio 中

    您好 我的问题是 当我想在 Android studio 中创建一个新项目并且我想选择带有片段的空白活动时 不是将活动添加到移动窗口 有什么解决方案可以帮助我修复它吗 进入下一页后即可找到它 只需选中 使用片段 框 然后单击 完成
  • Bootstrap Affix 更改列表项宽度

    我正在使用 Twitter Bootstrap 的后缀来附加当前包含导航列表的左栏 div class row div class span3 ul class nav nav list li class nav header Naviga
  • 专门为代表 Now 的 DateTime 制作一个包装器是个好主意吗?

    我最近注意到 为了模拟和测试目的 使用代表 现在 的 DateTime 作为方法的输入参数确实很好 而不是每个方法都调用DateTime UtcNow他们自己 我在上面的方法中执行一次 然后将其转发到下面的方法中 所以很多需要 现在 的方法