具体类型应如何以松散耦合的方式返回接口的实例
本文关键字:耦合 方式 返回 实例 接口 类型 | 更新日期: 2023-09-27 18:32:17
我有一个IDirectory
接口和一个实现它的Directory
类.
我需要创建一个IDirectoryEnumerator
它只有一个看起来像这样的方法:
IEnumerable<IDirectory> GetDirectories();
所以我创建了一个DirectoryEnumerator
类,但我不确定GetDirectories()
中返回哪个IDirectory
,因为我想保持我的代码松散耦合。
我应该使用带有约束的泛型来以某种方式IDirectory
吗?
我应该以某种方式通过DI容器获得它吗?
这样的东西应该紧密耦合,我应该专注于特定的混凝土类型吗?
还是有其他更好的选择?
注意:在我的示例中,具体类型的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 IEnumberable<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 ...
}