最近,我查看了Kazi Manzur Kigg MVC的实现(Kazi岩石),发现一些似乎违反了DRY / SOC原理的代码。我很想让大家对可能的重构分离想法的想法。
Kigg在每个存储库类上都实现了Add
和Remove
方法(注意:BaseRepository
具有虚拟方法,每个具体实现都可以重载)。Kigg.Repository.LinqToSql.CategoryRepository
和Kigg.Repository.LinqToSql.StoryRepository
的实现都通过其Remove
方法级联删除,以删除子实体。 (注意:Category与Story有一个父级关系(一对多),因此它们从Story到对象图共享相同的子级关系)see diagram。有问题的代码是两个存储库互相删除其他子实体的方式:
分类库
ojit_pre
故事库
ojit_pre
我是否可以假设更好的设计在CategoryRepository
上使用Remove
调用StoryRepository
方法,从而将对Story的子对象删除的关注委托给它所属的StoryRepository
,这是正确的吗?从维护的角度来看,对Story子项的任何添加都需要将DeleteAll
调用添加到CategoryRepository
和StoryRepository
中。
有什么更好的实施方案?
是否应该将CategoryRepository
重构为直接使用StoryRepository
?
CategoryRepository(重构)
ojit_pre
此重构将允许CategoryRepository
重用StoryRepository
中的删除逻辑,并且还应重用提供给DataContext
构造函数的Database
参数引用的相同LinqToSql StoryRepository
。但是当涉及到单元测试时,它开始有异味。
更好的重构方法包括使用IoC(Kigg使用Unity作为其Ioc容器)将PerWebRequest
的IStoryRepository
作用域实例注入到CategoryRepository
的构造函数中吗?
CategoryRepository(重构为2)
ojit_pre
通过第二个重构,我们现在可以在单元测试期间和通过Unity Ioc将IStoryRepository
的实例注入到CategoryRepository
中。当然,我们将必须将此重构扩展到每个存储库类,以便它们可以倾向于自己的孩子的职责。
每个人的想法是什么?
最佳答案
请问我对L2S的无知(我使用NHibernate),但是它不会自动处理级联吗?