我目前正在开发一个文件索引系统。我有一个可以立即获取文件项(文件/文件夹)的接口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。例如,我请求用户选择要索引的驱动器。我最初提供了一个本地驱动器列表和添加网络驱动器的功能。为了尽量保持代码的简单性,我认为具有选定属性的新类的想法可能会有所帮助。这允许图形用户界面枚举IndexedDiskDrives列表并设置/清除select属性。
发布于 2015-02-27 01:36:46
在这两个示例中,您都从另一个对象公开了IDiskDrive对象。在第一种情况下,您从相同的接口继承,这意味着您公开相同的方法,而在另一种情况下,您通过属性公开对象。
我还看不出你为什么要这么做。
对我来说,这听起来像一个典型的构造器依赖注入用例。只需为您的新类创建一个新接口,该接口执行不同的工作,因此需要不同的契约,如果它需要IDiskDrive对象作为依赖,那么只需通过构造函数注入它,并保持原样。
附言:我知道这不是您所要求的,但是您可能会对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
}
}https://stackoverflow.com/questions/28748888
复制相似问题