首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件索引软件-设计

文件索引软件-设计
EN

Stack Overflow用户
提问于 2015-02-27 01:26:57
回答 1查看 258关注 0票数 0

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

代码语言:javascript
复制
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,还是应该使用组合(可能是装饰器)?

代码语言:javascript
复制
// 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; }
   }
}

或者是构图。

代码语言:javascript
复制
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。例如,我请求用户选择要索引的驱动器。我最初提供了一个本地驱动器列表和添加网络驱动器的功能。为了尽量保持代码的简单性,我认为具有选定属性的新类的想法可能会有所帮助。这允许图形用户界面枚举IndexedDiskDrives列表并设置/清除select属性。

EN

回答 1

Stack Overflow用户

发布于 2015-02-27 01:36:46

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

我还看不出你为什么要这么做。

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

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

http://lucenenet.apache.org/

编辑:

根据您当前的类设计,我将执行以下操作:

代码语言:javascript
复制
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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28748888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档