我有一个
IDirectory
接口和一个实现它的 Directory
类。IDirectoryEnumerator
,它只有一个如下所示的方法:
IEnumerable<IDirectory> GetDirectories();
所以我创建了一个
DirectoryEnumerator
类,但我不确定要在IDirectory
中返回哪个GetDirectories()
,因为我想保持我的代码松散耦合。
我应该以某种方式使用带有
IDirectory
约束的泛型吗?注意:在我的示例中,
IDirectory
的具体类型没有任何默认构造函数并且是不可变的。
您可以让具体的
IDirectoryEnumerator
实现通过构造函数接受某种工厂(例如 IDirectoyFactory
),然后在该工厂中使用参数化方法来创建 IDirectory
的具体类型。
这也使测试变得更容易,并使您能够使用 DI 容器来注入依赖项。
示例:
public interface IDirectoryEnumerator
{
IEnumerable<IDirectory> GetDirectories();
}
public class DirectoryEnumImpl : IDirectoryEnumerator
{
private readonly IDirectoryFactory _directoryFactory;
public DirectoryEnumImpl(IDirectoryFactory directoryFactory)
{
_directoryFactory = directoryFactory;
}
public IEnumerable<IDirectory> GetDirectories()
{
// you can use the factory here
}
}
public interface IDirectoryFactory
{
IDirectory CreateDirectory(DirectoryType directoryType);
}
public class DirectoryFactoryImpl : IDirectoryFactory
{
IDirectory CreateDirectory(DirectoryType directoryType)
{
if (directoryType == DirectoryType.DIR_A)
return new Dir_A();
// the same goes for other types.
}
}
public enum DirectoryType
{
DIR_A, DIR_B, // etc ...
}