希望我可以解释一下这一点,因为它今天在我脑中燃烧了一个导火索.我正在用C#学习TDD,所以我仍然试图重新连接我的大脑以适应它.
假设我有一个User类,以前有一个静态方法来检索User对象(下面简化).
public static User GetUser(string username) { User user = GetUserFromCache(username); if(user == null) { user = GetUserFromDatabase(username); StoreObjectInCache(user); } return user; }
所以我试图重写这个以使用依赖注入,所以我可以假设"GetUserFromDatabase"方法,如果它需要去那里.这意味着我必须使该功能不是静态的.数据访问层将从数据库构造用户对象,将返回的列映射到对象属性,从缓存中检索将返回真蓝色的User对象.但是,在非静态方法中,我不能只说
this = GetUserFromCache(username);
因为它不会那样工作.虽然我不是世界上如何与OO一起跳舞的专家,看起来我几乎必须从缓存中获取User对象并编写另一个映射函数,将返回的User对象属性存储到新的用户实例.
这里有什么解决方案?我失踪了任何OO魔法?是重构所有内容以使用工厂而不是在对象本身中使用实例化逻辑的唯一解决方案吗?或者我一直盯着这个太久而且遗漏了一些完全明显的东西?
我认为你没有遗漏任何魔法,我认为重构从业务对象中删除持久性代码并进入持久层是从单元测试和设计角度进行的正确方法.您可能需要考虑将缓存放在业务层和持久层之间,调整业务对象的检索/更新以简化操作.如果你以这种方式分离,你应该能够模拟/伪造你的缓存和持久层.