逸言

使用扩展方法实现重用

| Comments

我们已经有了一个IRepository接口,它提供了诸如BatchSave(),Insert()之类的方法。其中,BatchSave()方法接收一个由实体类组成的数组,从而完成对实体对象的批量存储。

对于单个实体对象而言,我们当然也需要有相关的方法来完成存储。它与BatchSave()的区别仅在于它要接收的参数只是一个实体对象。事实上,我们可以调用IRepository接口本身提供的BatchSave()来实现Save()方法。Save()方法的实现对于所有实现了IRepository接口的类而言,完全是一样的。那么,我们该如何为IRepository接口增加一个Save()方法,同时又能避免代码做出太多修改?由于接口自身并不能提供实现,因此唯一可以容纳这个方法实现的就是实现了IRepository接口的类。一个办法是为所有这些实现类定义一个公共的抽象父类,并让它再实现IRepository接口,于是将Save()的实现放到这个抽象父类中,就可以使得所有子类共享Save()方法的实现了。可是,为了这个Save()方法的实现与重用,专门引入一个抽象父类,是否值得呢?除非在现有的Repository继承体系中,已经存在了这样的抽象父类,否则该类的引入会导致整个继承体系发生较大的变化。

在.NET中,我们可以巧妙地借助扩展方法来完成对Save()方法的重用,同时又能保证现有的继承体系不变。方法就是为IRepository接口提供扩展方法:

public static class RepositoryExtensions {
  public static void Save<T>(this IRepository<T> repository, T entity) {
      repo.BatchSave(new[] {entity});
  }
}

Comments