c# - TDD:静态方法、依赖注入(inject)、缓存,还有你!

标签 c# oop tdd

希望我能稍微体面地解释一下,因为它今天在我的大脑中烧断了导火索。我正在学习 C# 中的 TDD,所以我仍在尝试重新连接我的大脑以适应它。

假设我有一个 User 类,它以前有一个静态方法来检索 User 对象(在下面进行了简化)。

public static User GetUser(string username)
{
   User user = GetUserFromCache(username);
   if(user == null)
   {
       user = GetUserFromDatabase(username);
       StoreObjectInCache(user);
   }
   return user;
}

所以我试图重写它以使用依赖项注入(inject),这样我就可以伪造出“GetUserFromDatabase”方法(如果需要的话)。这意味着我必须使函数不是静态的。数据访问层将从数据库构造用户对象,将返回的列映射到对象属性,而从缓存中检索将返回真正的 User 对象。但是,在非静态方法中,我不能只说

this = GetUserFromCache(username);

因为它只是行不通。尽管我绝不是如何使用 OO 解决这个问题的世界专家,但看起来我几乎必须从缓存中获取 User 对象并编写另一个映射函数来将返回的 User 对象属性存储到新的用户实例。

这里的解决方案是什么?我缺少任何面向对象的魔法吗?重构一切以使用工厂而不是在对象本身中具有实例化逻辑的唯一解决方案是什么?还是我盯着这个看得太久而错过了一些非常明显的东西?

最佳答案

我不认为您遗漏了任何魔法,而且我认为从单元测试和设计角度来看,重构以从您的业务对象中删除持久性代码并将其放入持久性层是正确的方法。您可能想考虑让缓存位于业务层和持久层之间,调解业务对象的检索/更新以简化事情。如果您以这种方式将事物分开,您应该能够模拟/伪造您的缓存和持久层。

关于c# - TDD:静态方法、依赖注入(inject)、缓存,还有你!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603821/

相关文章:

php - 破坏构造函数

.net - 是否有适用于 VB6 的好的 TDD 工具或资源?

c# - 如何在 Asp.Net Core 2.x 中将 root 重定向到 swagger?

c# - 我有权启动/停止 Windows 服务吗?

c# - 如何按运行总数对对象列表进行分组?

c# - 使用 C# 仅获取 JSON 的一部分

java - JavaScript 对象和 OO/UML/Java 对象有什么区别?

C++链表节点存储通用对象

tdd - 作为 "mockist"TDD的从业者,我应该模拟与被测方法在同一类中的其他方法吗?

unit-testing - 如何在测试中表达函数/方法参数的 "don' t care"值