最近,我查看了Kazi Manzur Kigg MVC的实现(Kazi岩石),发现一些似乎违反了DRY / SOC原理的代码。我很想让大家对可能的重构分离想法的想法。

Kigg在每个存储库类上都实现了AddRemove方法(注意:BaseRepository具有虚拟方法,每个具体实现都可以重载)。

Kigg.Repository.LinqToSql.CategoryRepositoryKigg.Repository.LinqToSql.StoryRepository的实现都通过其Remove方法级联删除,以删除子实体。 (注意:Category与Story有一个父级关系(一对多),因此它们从Story到对象图共享相同的子级关系)see diagram。有问题的代码是两个存储库互相删除其他子实体的方式:

分类库
ojit_pre

故事库
ojit_pre

我是否可以假设更好的设计在CategoryRepository上使用Remove调用StoryRepository方法,从而将对Story的子对象删除的关注委托给它所属的StoryRepository,这是正确的吗?从维护的角度来看,对Story子项的任何添加都需要将DeleteAll调用添加到CategoryRepositoryStoryRepository中。

有什么更好的实施方案?

是否应该将CategoryRepository重构为直接使用StoryRepository
CategoryRepository(重构)
ojit_pre

此重构将允许CategoryRepository重用StoryRepository中的删除逻辑,并且还应重用提供给DataContext构造函数的Database参数引用的相同LinqToSql StoryRepository。但是当涉及到单元测试时,它开始有异味。

更好的重构方法包括使用IoC(Kigg使用Unity作为其Ioc容器)将PerWebRequestIStoryRepository作用域实例注入到CategoryRepository的构造函数中吗?

CategoryRepository(重构为2)
ojit_pre

通过第二个重构,我们现在可以在单元测试期间和通过Unity Ioc将IStoryRepository的实例注入到CategoryRepository中。当然,我们将必须将此重构扩展到每个存储库类,以便它们可以倾向于自己的孩子的职责。

每个人的想法是什么?

最佳答案

请问我对L2S的无知(我使用NHibernate),但是它不会自动处理级联吗?

09-26 21:40