处理一批项目,返回一个对象以报告状态

时间:2010-06-02 15:01:56

标签: c# design-patterns

我正在为以下场景寻找模式(或良好做法):

我的函数List<BatchItemResponse> Process(List<BatchItem> Data) {..}将处理数据列表,并返回批处理中每个项目的处理信息。

struct BatchItemResponse { int BatchItemID; bool Processed; string Description; }

有什么想法?是我提出的那样好吗?

1 个答案:

答案 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列表。