我正在研究使用責任鏈處理請求的應用程序。我知道如何建立連鎖店,但如果你看看下面的例子,我將不得不打電話link1.Process(request);
來啓動連鎖過程。我想弄明白的是,有沒有一種方法可以像集合一樣對待它,只需調用鏈中的第一個鏈接,無論這可能是什麼?原因是,我知道基本元素是什麼(最終的默認對象),但其他程序員可以將對象添加到鏈中,並可能將它們置於鏈條永遠不會到達的位置。責任鏈動態鏈
public class MergedFieldProcessor
{
public MergedFieldProcessor()
{
//Define CoR here
FieldProcessor link1 = new FieldProcessor();
FieldProcessor link2 = new FieldProcessor();
FieldProcessor link3 = new FieldProcessor();
link1.SetNextProcessor(link2);
link2.SetNextProcessor(link3);
}
}
public abstract class FieldProcessor
{
private FieldProcessor NextProcessor { get; set; }
public FieldProcessor()
{
this.NextProcessor = new SprocObject();
}
public void SetNext (FieldProcessor successor)
{
this.NextProcessor = successor;
}
//determines if this link in the change is responsible for the request
public abstract Boolean WillProcess(MergedFieldProcessorRequest request);
//performs the processing required for the tag
public abstract void ProcessField(MergedFieldProcessorRequest request);
//chain method that passes the request
public void ProcessRequest(MergedFieldProcessorRequest request)
{
if (!this.WillProcess(request))
this.NextProcessor.ProcessRequest(request);
else
this.ProcessField(request);
}
}
public class MergedFieldProcessorRequest
{
public MergedField Field { get; set; }
public Dictionary<string, string> SearchParams { get; set; }
}
可達鏈接的例子:
FieldProcessor link1 = new FieldProcessor();
FieldProcessor link2 = new FieldProcessor();
FieldProcessor link3 = new FieldProcessor();
FieldProcessor link4 = new FieldProcessor();
link4.SetNext(link1);
link1.SetNext(link2);
link2.SetNext(link3);
,如果他們沒有修改,其中過程initated說link4.Process(request)
代碼,然後LINK4絕不會是鏈的一部分。
簡而言之,是否有可能動態構建鏈,這樣如果有人將對象添加到集合中,它會自動添加到鏈中?
你對這個問題想得太多了。如果你的消費者遺漏了一個鏈接,這很可能是故意的。如果他們不這樣做,那是他們的錯。這與強制編譯器確保while循環被關閉相似,只是因爲可以使用while循環來進行無限循環。 –
所有這些看起來像你沒有使用C#和.Net提供的任何好的功能。這背後的真正要求是什麼?我相信有很多更好的方法來實現你所需要的,比如MEF。 –