0

我有一个IDirectory接口和一个Directory实现它的类。
我需要创建一个IDirectoryEnumerator只有一个看起来像这样的方法:

IEnumerable<IDirectory> GetDirectories();

所以我创建了一个DirectoryEnumerator类,但我不确定IDirectory要返回哪个类GetDirectories(),因为我想让我的代码保持松散耦合

IDirectory我应该以某种方式使用带有约束的泛型吗?
我应该通过 DI 容器以某种方式获取它吗?
像这样的东西是否应该紧密耦合,我应该专注于特定的具体类型?
或者还有其他更好的选择吗?

注意:IDirectory我的示例中的具体类型没有任何默认构造函数并且是不可变的。

4

1 回答 1

1

您可以让具体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 ...
}
于 2013-09-21T09:53:53.797 回答