2014-02-21 38 views
1

這個問題的標題看起來很奇怪,但我不知道如何清楚地命名它。如何實現處理類之間不同類型的責任鏈

這裏是問題:我有一個服務器,它可以接受短信,並有3類:Pipeline,IParserISolver。 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

一個示例代碼會有幫助 – Miller

+0

同意米勒 - 請顯示*代碼*,你有問題。如果這是一個通用的問題,與特定的代碼無關,那麼最好在http://programmers.stackexchange.com/ –

+0

上提問。很抱歉,我的帖子中添加了代碼。所以我的問題是與SolverData類,我的一些求解器需要AnotherSolverData類對象 –

回答

1

我認爲你需要爲不同的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; 
    } 
} 

+0

嗯,聽起來不錯,我會試試這個。非常感謝你!我會將其標記爲解決方案。 –

相關問題