我正在为以下场景寻找模式(或良好做法):
我的函数List<BatchItemResponse> Process(List<BatchItem> Data) {..}
将处理数据列表,并返回批处理中每个项目的处理信息。
struct BatchItemResponse { int BatchItemID; bool Processed; string Description; }
有什么想法?是我提出的那样好吗?
答案 0 :(得分:3)
你可以完全按照你的建议做 - 它会工作得很好。但是,既然你正在谈论模式,那么根据你的目标,有一些潜在的优雅可能性。
您可以使用Iterator模式(.NET的可爱枚举器将其详细信息隐藏起来):
IEnumerable<BatchItemResponse> Process(List<BatchItem> Data)
{
foreach (BatchItem item in Data)
{
BatchItemResponse result = new BatchItemResponse();
result.Processed = ProcessItem(item);
yield return result;
}
}
或者您可以通过触发感兴趣的观察者订阅的事件来使用观察者模式:
public class EventArgs<T> : EventArgs
{
public EventArgs(T value)
{
m_value = value;
}
private T m_value;
public T Value
{
get { return m_value; }
}
}
public event EventHandler<EventArgs<BatchItemResponse> ItemProcessed;
public void Process(List<BatchItem> Data)
{
foreach (BatchItem item in Data)
{
BatchItemResponse result = new BatchItemResponse();
result.Processed = ProcessItem(item);
if (ItemProcessed != null)
{
ItemProcessed(this, new EventArgs<BatchItemResponse>(result));
}
}
}
这些模式中的任何一个的好处在于,正确使用它们可以让您实时更新状态,而不是等待处理整个BatchItem列表。