文件索引软件 - 设计

时间:2015-02-26 17:26:57

标签: c# software-design

我目前正在开发文件索引系统。我有一个接口IDiskDrive,可以立即获取文件(文件/文件夹)。接口定义如下......

public interface IDiskDrive
{
  bool IsReady { get; }

  string Name { get; }
  string VolumeLabel { get; }
  string VolumeLabelName { get; }

  DiskDriveType Type { get; }
  FolderPath RootFolder { get; }

  DiskDriveUsage Usage { get; }

  IEnumerable<IFileItem> GetImmediateFileItems(FolderPath path);
}

读取所有文件/文件夹的功能已完成且工作正常。现在,我需要实际索引文件文件和文件夹。展望未来我知道我需要一些报告工具。这让我认为我需要另一种抽象,基于可以读/填充的IDiskDrive。我还需要能够选择驱动器进行索引。

我的问题是我的新课程是继承IDiskDrive还是应该使用合成(可能是装饰师)?

// inheritance
class IndexedDiskDrive : IDiskDrive
{
   public IndexedDiskDrive(IDiskDrive drive)
   {
      ...
   }

   public int Id {get; internal set; }  // database id
   public bool Selected { get; internal set; }
   public DateTime? DateLastIndexed { get; internal set; }

   // IDiskDrive implementation
   public bool IsReady
   {
     get { return this.Drive.IsReady; }
   }
}

或作文......

class IndexedDiskDrive
{
  public IndexDiskDrive(IDiskDrive drive)
  {
    this.Value = drive;
  }

  public IDiskDrive Value
  {
    get;
    private set;
  }

  // additional properties
  public int Id { get; internal set; }
  public bool Selected { get; internal set;}
  public DateTime DateLastIndexed { get; internal set; }      
}

注意:   我需要访问UI的底层IDiskDrive。 例如,我请求用户选择要编制索引的驱动器。我最初提供了本地驱动器列表以及添加网络驱动器的功能。为了尝试保持代码简单,我认为使用选定属性的新类的想法可能会有所帮助。 这允许GUI枚举IndexedDiskDrives列表并设置/清除select属性。

1 个答案:

答案 0 :(得分:0)

在这两个示例中,您将从其他对象公开IDiskDrive对象。在第一种情况下,您从相同的接口继承,这意味着您公开相同的方法,而在另一种情况下,您通过属性公开对象。

我没有理由说明你为什么要这样做。

对我来说,这听起来像是一个典型的构造函数DI案例。只需要为新类创建一个新接口,它正在执行不同的工作,因此需要不同的合同,如果它需要将IDiskDrive对象作为依赖项,那么只需通过构造函数注入它并保持原样。

P.S。:我知道这不是你问的问题,但你可能对Lucense.NET感兴趣,它是一个用于索引文件的.NET库。他们可能已经为您解决了问题:

http://lucenenet.apache.org/

编辑:

根据您目前的课程设计,我会做以下事情:

void Main()
{
    // Use IoC container in real app:
    var diskDrive = new DiskDrive(...);
    var fileIndexer = new FileIndexer();

    var fileItems = diskDrive.GetImmediateFileItems(filePath);
    fileIndexer.IndexFiles(fileItems);
}

// Define other methods and classes here
public interface IDiskDrive
{
  bool IsReady { get; }

  string Name { get; }
  string VolumeLabel { get; }
  string VolumeLabelName { get; }

  DiskDriveType Type { get; }
  FolderPath RootFolder { get; }

  DiskDriveUsage Usage { get; }

  IEnumerable<IFileItem> GetImmediateFileItems(FolderPath path);
}

public interface IFileIndexer
{
    void IndexFiles(IEnumerable<IFileItem> files);
}

public class FileIndexer : IFileIndexer
{
    public void IndexFiles(IEnumerable<IFileItem> files)
    {
        // do stuff
    }
}