如何在处理类之间实现不同类型的责任链

时间:2014-02-21 09:22:55

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

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

问题在于:我有一台服务器,它可以接受短信并有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);
}

1 个答案:

答案 0 :(得分:1)

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

public class SolverDataA {}
public class SolverDataB {}

public interface IParserA {
    SolverDataA Parse(string input);
}
public interface IParserB {
    SolverDataA Parse(string input);
}
public interface ISolver {
    string Execute(string input);
}
public class SolverA: ISolver {
   private readonly IParserA parser;
   public SolverA(IParserA parser){
      Requires.IsNotNull(parser, "parser");
      this.parser = parser;
   }
   public string Execute(string input) {
      SolverDataA da = parser.Parse(input);
      // solve
      return s;
   }
}
public class SolverB: ISolver {
   private readonly IParserB parser;
   public SolverB(IParserB parser){
      Requires.IsNotNull(parser, "parser");
      this.parser = parser;
   }
   public string Execute(string input) {
      SolverDataB db = parser.Parse(input);
      // solve
      return s;
   }
}