我有一个应用程序,使用Linq to Objects查询本地数据存储(当前由XML文件支持)。应用程序中的另一个线程会定期向远程服务器查询更新的数据,如果存在,将下载所有远程数据,对其进行反序列化,并在将新的XML保存到磁盘之前用新反序列化的数据替换本地对象。
我决定用SQLite数据库替换XML文件,我打算使用Entity Framework与它进行交互。这促使我重新审视外部更改的应用方式,并且我已经决定只更新远程实体updated_at
属性比本地实体更新的数据(而不是当前实体)替换整个数据集的方法)
所以我必须编写一个方法来下载外部更改并更新或将相关实体插入SQLite数据库。
我不明白的是,在建筑方面,这种方法应该放在哪里。我(可能天真)的想法是,通用的UpdateFromRemoteObjects<T>(List<T> updatedItems)
方法可以放在DbContext
类中,并接受实体列表并更新相应的DbSet
。但这感觉它可能与DbContext
过于紧密耦合。我应该使用存储库来提供实现此功能的层吗?或者另一种应用程序架构更合适?
答案 0 :(得分:1)
许多人在设计组件时都以CRC开头:课程有职责和协作者
首先考虑单一责任原则:一个有两个或两个以上责任的班级可能做得太多了。这是你没有把方法放在DbContext上的原因:这个更新的东西是一个新的独特的责任,所以为它创建一个类。
我可以看到这个类做了两件事:QueryRemoteServerForChanges和UpdateLocalObjects。
现在考虑其合作者。它似乎需要两个:一个用于本地更改的DbContext实例,以及一个允许访问远程数据的实例。
所以不是存储库否;而不是一层;但绝对是一个有责任感的班级。