依赖注入将依赖关系传递给其他具体类型

时间:2012-09-18 15:33:51

标签: design-patterns dependency-injection constructor-injection

我确信这不是什么大问题而且应用程序并不大,但我正试图在任何地方练习DI,以获得经验。我有以下类,它所做的就是解析用户在控制台应用程序中输入的一些参数,并根据传入的参数返回ICommand的实例。使用控制台应用程序中的命令的设计取自Mark Seeman的书籍Dependency Injection in 。净。我的问题是ICommand类的一个实现需要一个IDocumentService的实例。现在确保我能够满足对我的ICommand的依赖性我正在使用构造函数注入将IDocumentService传递给Parser。这对我来说似乎很奇怪,因为我认为如果一个类有一个依赖项,它应该使用该依赖项,而不仅仅是将它传递给一个依赖项。同时我认为,如果我构建一个抽象的IDocumentServiceFactory,以便Parser类可以在文档根之后解析IDocumentService,那就太过分了。任何解决此设计问题的指导都表示赞赏。

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]);
    }
}

1 个答案:

答案 0 :(得分: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]);
    }
}