2

我确信这没什么大不了的,应用程序也不大,但我正在尝试在任何我可以的地方练习 DI,以获得经验。我有以下类,它所做的只是解析用户在控制台应用程序中输入的一些参数,并根据传入的参数返回一个 ICommand 实例。在控制台应用程序中使用命令的设计取自 Mark Seeman 的书 Dependency Injection 。网。我的问题是 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]);
    }
}
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 回答