到目前为止,我创建了以下接口(interface):
public interface IDirectoryInfoWrapper
{
public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType);
public IDirectoryInfoWrapper[] GetDirectories();
}
我一直在研究用 IDirectoryInfoWrapper
替换 DirectoryInfo 的代码。一切顺利,直到我发现这个:
// Check that the directory is valid
DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
if ( directoryInfo.Exists == false )
{
throw new ArgumentException
("Invalid IFileFinder.FindFiles Directory Path: " + argPath);
}
将构造函数放在接口(interface)中是没有意义的,那么我应该如何处理这行代码:
DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
最佳答案
我看到两个明显的选择:
- 将
DirectoryInfo
替换为您自己的包装实现(不理想) - 创建一个可以生成
IDirectoryInfoWrapper
实例的工厂。您可以创建一个Create
函数,为您要使用的每个构造函数重载。
我假设您使用依赖注入(inject)来执行此操作,这意味着现在您只需将该工厂注入(inject)到任何需要创建新目录信息对象的类中即可。
此外,您可能希望修改包装器接口(interface)以公开该 Exists
属性
编辑:如果你这样做是为了尝试对某些东西进行单元测试(这似乎很可能),那么你可以尝试阅读 Misko Hevery .每次在 C# 中使用 new
运算符时,都会遇到无法在运行时注入(inject)某些内容的问题。这使得除了最微不足道的情况外,很难使用 new
测试任何东西。对于任何不是简单数据对象的东西,我几乎总是使用工厂。
编辑二:
您将构造委托(delegate)给工厂,因此您可以在此处使用 DirectoryInfo
真正的构造函数:
class Factory : IFactory
{
IDirectoryInfoWrapper Create(string arg)
{
var dirInfo = new DirectoryInfo(arg);
var wrapper = new DirectoryInfoWrapper(dirInfo);
return wrapper;
}
}
关于c# - 如何模拟 DirectoryInfo 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159661/