我确信这不是什么大问题而且应用程序并不大,但我正试图在任何地方练习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]);
}
}
答案 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]);
}
}