我目前正在开发文件索引系统。我有一个接口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属性。
答案 0 :(得分:0)
在这两个示例中,您将从其他对象公开IDiskDrive对象。在第一种情况下,您从相同的接口继承,这意味着您公开相同的方法,而在另一种情况下,您通过属性公开对象。
我没有理由说明你为什么要这样做。
对我来说,这听起来像是一个典型的构造函数DI案例。只需要为新类创建一个新接口,它正在执行不同的工作,因此需要不同的合同,如果它需要将IDiskDrive对象作为依赖项,那么只需通过构造函数注入它并保持原样。
P.S。:我知道这不是你问的问题,但你可能对Lucense.NET感兴趣,它是一个用于索引文件的.NET库。他们可能已经为您解决了问题:
编辑:
根据您目前的课程设计,我会做以下事情:
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
}
}