如何在C#中实现“问题和提交”模式?

时间:2009-11-24 13:40:07

标签: c# design-patterns

在我正在进行的类库中,我需要实现一种机制,通过对Issuer类进行操作,类用户将获得一个项目:

class Issuer {
    public Item GetItem () {
        return queue.Pop ();
    }
}

//at some other place
var item = issuer.GetItem ();
//work on item and submit back to Issuer

如何实施这种模式,最大限度地降低班级用户甚至不愿意将其提交回来的风险?

我的偏好顺序是:

  • 类用户无需显式提交
  • 类用户必须明确提交回来,但如果没有提交就不可能逃脱(例外???)
  • 甚至可以在不提交的情况下离开,但设计鼓励用户不要这样做

我知道这不是一个非常明确的问题,但上面实施的任何建议/设计模式都会有所帮助!

4 个答案:

答案 0 :(得分:2)

维护已发布项目的集合,可能存储它们的发布时间以及发布它们的类。这样您就不必显式重新提交该项目。 重新提交显然从已发布的集合中删除。然后,如果已发布的集合中仍有项目,则可以选择基于“脏”数据以多种方式抛出异常。 你可以:

  • 处理来自请求类的事件(如果您存储了例如表单结束事件
  • 会定期为所有早于x
  • 的项目抛出一个拼版
  • 如果未完成项目的数量超过某个阈值

我要说的一件事可能是查看静态发行者而不是将其作为实例方法。

答案 1 :(得分:2)

这样做的一种方法是使用IDisposable接口。这样,用户可以在使用期间利用using语句:

using (var item = issuer.GetItem())
{
    // Work on item
} // Item is released on Dispose()

发行人可以简单地听一个事件来取回物品。但是,如果物品被传递,它可能不是你最好的选择。在这种情况下,一个简单的Close()Release()方法(再次让发行者监听一个事件)可能就是这样做的。

在大多数情况下,用户最好以某种方式明确释放获得的项目。

如果某些不重要的用户省略了释放项目,您可以随时使用标准的Dispose模式返回 Finalizer 。但是,您必须非常小心不要复活该项目(在完成后保留参考)。

答案 2 :(得分:2)

听起来IDisposable可能在这里很有用。怎么样:

class Item { }

class Issuer: IDisposable
{
    Queue<Item> queue = new Queue<Item>();
    List<Item> deliveredItems = new List<Item>();

    public Item GetItem()
    {
        Item item = queue.Dequeue();
        deliveredItems.Add(item);
        return item;
    }

    public void SubmitItem(Item item)
    {
        deliveredItems.Remove(item);

        // do some operation here
    }

    public void Dispose()
    {
        foreach (Item item in deliveredItems)
        {
            SubmitItem(item);
        }
    }
}

class Issuer: IDisposable { Queue<Item> queue = new Queue<Item>(); List<Item> deliveredItems = new List<Item>(); public Item GetItem() { Item item = queue.Dequeue(); deliveredItems.Add(item); return item; } public void SubmitItem(Item item) { deliveredItems.Remove(item); // do some operation here } public void Dispose() { foreach (Item item in deliveredItems) { SubmitItem(item); } } }

一旦您的发卡行处理,每个尚未提交的交付物品将自动提交。

答案 3 :(得分:-1)

使用某个事件让发卡人知道某个项目已被获取并使用某个事件将其传回发卡行。