我正在开发一个应用程序,它使用一系列责任来处理请求。我知道如何构建链,但是如果您查看下面的示例,我将不得不调用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);如果他们没有修改流程被激发为link4.Process(request)的代码,那么link4就永远不会成为链的一部分。
简而言之,是否可以动态地构建该链,以便如果有人将对象添加到集合中,则该对象将自动添加到该链中?
发布于 2013-08-05 16:33:26
这是我想出的解决办法。只需将每个处理器添加到集合中,然后迭代该集合以构建链,并处理该链,只需调用this.Links[0].Process(request);即可。
#region Build Chain Collection;
this.Links = new List<FieldProcessor>()
{
new StudentEnrollmentDetailsProcessor(),
new SprocObject()
};
#endregion;
#region Build Chain Dynamically
for (int i = 0; i < this.Links.Count(); i++)
{
if (i < this.Links.Count())
{
this.Links[i].SetNext(this.Links[i + 1]);
}
}
#endregion;发布于 2013-08-02 20:53:14
你想给用户建立链的能力..。没有能力建造锁链?
用户要么负责链接对象,要么扔掉链接,并为FieldProcessor提供任何集合(然后按集合顺序调用它们)。
如果链接很重要,那么最好的方法是在处理之前对循环和不可访问的链接进行链验证。
发布于 2016-09-14 10:19:04
您可以使用反射和一些递归。
public class MergedFieldProcessor
{
private FieldProcessor first;
private FieldProcessor CreateLink(IEnumerator<Type> processors)
{
if(processors.MoveNext())
{
FieldProcessor link = (FieldProcessor)Activator.CreateInstance(processors.Current);
link.NextProcessor = CreateLink(processors);
return link;
}
return null;
}
public MergedFieldProcessor()
{
var processType = typeof(FieldProcessor);
var allProcess = processType.Assembly.GetTypes()
.Where(t => t != processType && processType.IsAssignableFrom(t));
first = CreateLink(allProcess.GetEnumerator());
}
public void Handle(MergedFieldProcessorRequest request)
{
first.ProcessRequest(request);
}
}这将确保所有可能的链接都被创建并链接在一起,但请注意:最后一个链接将有一个null后继,通常它必须是一个更紧密的链(将处理任何请求)。
https://stackoverflow.com/questions/18025716
复制相似问题