具体类型应如何以松散耦合的方式返回接口的实例

本文关键字:耦合 方式 返回 实例 接口 类型 | 更新日期: 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 ...
}