7

到目前为止,我创建了以下界面:

  public interface IDirectoryInfoWrapper
  {
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType);
    public IDirectoryInfoWrapper[] GetDirectories();
  }

我一直在浏览将 DirectoryInfo 替换为IDirectoryInfoWrapper. 一切都很顺利,直到我发现这个:

  // Check that the directory is valid
  DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
  if ( directoryInfo.Exists == false )
  {
    throw new ArgumentException
        ("Invalid IFileFinder.FindFiles Directory Path: " + argPath);
  }

将构造函数放在接口中是没有意义的,那么我应该如何处理这行代码:

DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
4

2 回答 2

6

我看到两个明显的选择:

  1. 在那里替换DirectoryInfo为您自己的包装器实现(不理想)
  2. 创建一个可以制作IDirectoryInfoWrapper实例的工厂。您可以Create为要使用的每个构造函数创建一个带有重载的函数。

我假设您正在使用依赖注入来执行此操作,这意味着您现在只需将该工厂注入到任何需要创建新目录信息对象的类中。

此外,您可能希望修改包装接口以公开该Exists属性

编辑:如果您这样做是为了尝试对某些东西进行单元测试(这似乎很可能),那么您可以尝试阅读Misko Hevery。每次new在 C# 中使用运算符时,都会遇到无法在运行时注入某些内容的情况。new这使得在除了最微不足道的情况之外的任何情况下都很难测试任何东西。对于任何不是简单数据对象的东西,我几乎总是使用工厂。

编辑二

您将构建委托给工厂,因此您可以在其中使用DirectoryInfo真正的构造函数:

class Factory : IFactory 
{
  IDirectoryInfoWrapper Create(string arg)
  {
    var dirInfo = new DirectoryInfo(arg);
    var wrapper = new DirectoryInfoWrapper(dirInfo);
    return wrapper;
  }
}
于 2012-06-22T15:52:11.283 回答
1

该链接给出了如何模拟文件类的示例,您需要对 DirectoryInfo 执行类似操作如何在 C# 中模拟文件系统以进行单元测试?

于 2012-06-22T15:55:22.917 回答