【问题标题】:How to implement responsibility chain with different types between processing classes如何在处理类之间实现不同类型的责任链
【发布时间】:2014-02-21 09:22:54
【问题描述】:

这个问题的标题看起来很奇怪,但我不知道如何清楚地命名它。

问题是:我有一个服务器,它可以接受短信并有 3 个类:PipelineIParserISolver。 Pipeline 结合了解析器和求解器,因此用户可以对解析器和求解器进行不同的配置,例如,他可以将一个解析器用于 3 个或更多求解器。所有这些东西都是使用反射加载的(为解析器和求解器加载具体类)。这与责任链非常相似,但有以下区别:解析器将文本文件解析为某个类,我们称之为SolverData。但问题是不同的求解器应用不同的数据。那么如何在加载此应用程序时检查解析器输出类型和求解器输入类型的正确性?

当我没有使用 DI 并且只有一种类型的数据用于求解器时,这是我的代码示例:

 public class Pipeline
{
    private ISolver _itsSolver;

    private IParser _itsParser;

    public Initialize()
    {
        //init code
    }

    public string Execute(string userInput)
    {
        return _itsSolver.Execute(_itsParser.Parse(userInput));
    }
}

public interface ISolver
{
    string Execute(SolverData data);
}

public interface IParser
{
    SolverData Parse(string input);
}

【问题讨论】:

  • 一个示例代码会很有帮助
  • 同意米勒 - 请显示您有问题的代码。如果这是一个通用问题,与特定代码无关,那么最好在programmers.stackexchange.com 上提问
  • 抱歉,在我的帖子中添加了代码。所以我的问题是 SolverData 类,我的一些求解器需要 AnotherSolverData claa 对象

标签: c# .net design-patterns dependency-injection


【解决方案1】:

我认为不同的 SolverData 需要不同的 Parser 接口... 可能是这样的:

公共类 SolverDataA {} 公共类 SolverDataB {} 公共接口 IParserA { SolverDataA Parse(字符串输入); } 公共接口IParserB { SolverDataA Parse(字符串输入); } 公共接口 I Solver { 字符串执行(字符串输入); } 公共类SolverA:ISolver { 私有只读 IParserA 解析器; 公共 SolverA(IParserA 解析器){ Requires.IsNotNull(parser, "parser"); this.parser = 解析器; } 公共字符串执行(字符串输入){ SolverDataA da = parser.Parse(input); // 解决 返回 s; } } 公共类SolverB:ISolver { 私有只读 IParserB 解析器; 公共 SolverB(IParserB 解析器){ Requires.IsNotNull(parser, "parser"); this.parser = 解析器; } 公共字符串执行(字符串输入){ SolverDataB db = parser.Parse(input); // 解决 返回 s; } }

?

【讨论】:

  • 嗯,听起来不错,我试试这个。非常感谢!我会将此标记为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多