gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:21:12 24 4
gpt4 key购买 nike

希望我能稍微体面地解释一下,因为它今天在我的大脑中烧断了导火索。我正在学习 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com