0

IDirectoryインターフェイスとDirectoryそれを実装するクラスがあります。次のようなメソッドを持つ
を作成する必要があります。IDirectoryEnumerator

IEnumerable<IDirectory> GetDirectories();

クラスを作成しましたが、コードを疎結合にしたいので、 でどちらを返せDirectoryEnumeratorばよいかわかりません。IDirectoryGetDirectories()

どういうわけか、制約付きのジェネリックを使用する必要がありますIDirectoryか?
どうにかしてDIコンテナを介して取得する必要がありますか?
そのようなものは密結合である必要があり、特定の具体的なタイプに焦点を当てる必要がありますか?
または、別のより良いオプションがありますか?

注:IDirectory私の例の具体的な型には、既定のコンストラクターがなく、不変です。

4

1 に答える 1

1

具体的な実装に、コンストラクターを介してIDirectoryEnumeratorある種のファクトリ (例: ) を受け入れさせ、そのファクトリでパラメーター化されたメソッドを使用して、具体的な型の を作成することができます。IDirectoyFactoryIDirectory

これにより、テストが容易になり、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 に答える