2

これは大したことではなく、アプリケーションも大きくはないと確信していますが、経験を積むために、できる限りどこでもDIを練習しようとしています。私は次のクラスを持っており、コンソールアプリケーションでユーザーが入力したいくつかの引数を解析し、渡された引数に基づいてICommandのインスタンスを返します。コンソールアプリでコマンドを使用する設計は、MarkSeemanの著書であるDependencyInjectionから引用しています。 。ネット。私の問題は、ICommandクラスの1つの実装にIDocumentServiceのインスタンスが必要なことです。今のところ、ICommandへの依存関係を満たすことができることを確認するために、コンストラクターインジェクションを使用してIDocumentServiceをパーサーに渡します。クラスに依存関係がある場合は、依存関係に渡すだけでなく、その依存関係を使用する必要があると思うので、これは奇妙に思えます。同時に、Parserクラスがドキュメントルートよりも後でIDocumentServiceを解決できるように、抽象IDocumentServiceFactoryを構築した場合、それはやり過ぎだと思います。この設計上の問題を解決するためのガイダンスをいただければ幸いです。

public class GasTranParser
{
    private readonly IArchiveService service;
    public GasTranParser(IArchiveService service)
    {
        if(service == null)
            throw new ArgumentNullException("service");
    }


    ICommand Parse(IEnumerable<string> args)
    {
        if (args == null || args.Count() != 1)
            return new HelpCmd();

        List<string> argsList = args.ToList();

        return new GasTranComposerCmd(service, argsList[0]);
    }
}
4

1 に答える 1

2

一般に依存関係を渡すことに問題はありませんが、特定の例では、代わりにICommandFactoryをGasTranParserに渡し、具体的なCommandFactoryに適切なサービスでGasTranComposerCmdインスタンスを作成させたいようです。

public class GasTranParser
{
    private readonly ICommandFactory command_factory;

    public GasTranParser(ICommandFactory command_factory) { ... }    

    ICommand Parse(IEnumerable<string> args)
    {
        if (args == null || args.Count() != 1)
            return new HelpCmd();

        List<string> argsList = args.ToList();

        return command_factory(argList[0]);
    }
}
于 2012-09-20T21:59:59.560 に答える